首页 > 其他 > 详细

[校内训练20_09_29]ABC

时间:2020-09-29 15:42:20      阅读:44      评论:0      收藏:0      [点我收藏+]

1.问一个圆上的最多不交弧的个数。

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1E6+5;
 4 int n,m,tot;
 5 int totT,tmp[maxn],jump[maxn][20];
 6 struct line
 7 {
 8     int l,r;
 9     bool operator<(const line&A)const
10     {
11         return r<A.r;
12     }
13 }a[maxn];
14 int t[maxn*4];
15 void change(int l,int r,int pos,int x,int num)
16 {
17     if(t[num]==0||a[x].r<a[t[num]].r)
18         t[num]=x;
19     if(l==r)
20         return;
21     int mid=(l+r)>>1;
22     if(pos<=mid)
23         change(l,mid,pos,x,num<<1);
24     else
25         change(mid+1,r,pos,x,num<<1|1);
26 }
27 int ask(int L,int R,int l,int r,int num)
28 {
29     if(L<=l&&r<=R)
30         return t[num];
31     int mid=(l+r)>>1;
32     if(R<=mid)
33         return ask(L,R,l,mid,num<<1);
34     else if(mid<L)
35         return ask(L,R,mid+1,r,num<<1|1);
36     int x=ask(L,R,l,mid,num<<1),y=ask(L,R,mid+1,r,num<<1|1);
37     if(x==0)
38         return y;
39     else if(y==0)
40         return x;
41     else if(a[x].r<a[y].r)
42         return x;
43     return y;
44 }
45 inline void solve()
46 {
47     for(int i=1;i<=tot;++i)
48         tmp[++totT]=a[i].l,tmp[++totT]=a[i].r;
49     sort(tmp+1,tmp+totT+1);
50     totT=unique(tmp+1,tmp+totT+1)-tmp-1;
51     sort(a+1,a+tot+1);
52     int ans=0;
53     for(int i=tot;i>=1;--i)
54     {
55         int pos=lower_bound(tmp+1,tmp+totT+1,a[i].r)-tmp;
56         int x=ask(pos,totT,1,totT,1);
57         jump[i][0]=x;
58         pos=lower_bound(tmp+1,tmp+totT+1,a[i].l)-tmp;
59         change(1,totT,pos,i,1);
60     }
61     for(int j=1;j<20;++j)
62         for(int i=1;i<=tot;++i)
63             jump[i][j]=jump[jump[i][j-1]][j-1];
64     for(int i=1;i<=tot;++i)
65     {
66         int s=1;
67         int u=i;
68         for(int j=19;j>=0;--j)
69             if(jump[u][j]&&a[jump[u][j]].r-a[i].l<=m)
70             {
71                 s+=1<<j;
72                 u=jump[u][j];
73             }
74         ans=max(ans,s);
75     }
76     cout<<ans<<endl;
77 }
78 int main()
79 {
80     freopen("circular.in","r",stdin);
81     freopen("circular.out","w",stdout);
82     ios::sync_with_stdio(false);
83     cin>>m>>n;
84     for(int i=1;i<=n;++i)
85     {
86         int l,r;
87         cin>>l>>r;
88         if(l<r)
89         {
90             a[++tot]=(line){l,r};
91             a[++tot]=(line){l+m,r+m};
92         }
93         else
94             a[++tot]=(line){l,r+m};
95     }
96     solve();
97     return 0;
98 }
View Code

2.用L字型的骨牌覆盖,棋盘上只有(x+y)%2==1的位置有数字,一个骨牌会有贡献当且仅当拐角处有数字。问最大贡献。

技术分享图片
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long int ll;
  4 const int maxn=1E6+5;
  5 const ll inf=1E12;
  6 int tot,n,m,k,a[505][505],id1[505][505],id2[505][505];
  7 int dx[4]={0,1,0,-1};
  8 int dy[4]={1,0,-1,0};
  9 bool ban[505][505];
 10 namespace FLOW
 11 {
 12     int S,T;
 13     int size=1,head[maxn],from[maxn];
 14     ll dis[maxn],maxF[maxn];
 15     bool vis[maxn];
 16     struct edge
 17     {
 18         int to,next;
 19         ll cost,flow;
 20     }E[maxn*2];
 21     inline void addE(int u,int v,int c,int f)
 22     {
 23         E[++size].to=v;
 24         E[size].next=head[u];
 25         E[size].cost=c;
 26         E[size].flow=f;
 27         head[u]=size;
 28     }
 29     inline void add(int u,int v,int c,int f)
 30     {
 31 //        cout<<"ADD "<<u<<" "<<v<<" "<<c<<" "<<f<<endl;
 32         addE(u,v,c,f);
 33         addE(v,u,-c,0);
 34     }
 35     inline bool bfs()
 36     {
 37         for(int i=0;i<=T;++i)
 38             maxF[i]=0,dis[i]=-inf;
 39         queue<int>Q;
 40         Q.push(S);
 41         dis[S]=0;
 42         maxF[S]=inf;
 43         while(!Q.empty())
 44         {
 45             int u=Q.front();
 46             Q.pop();
 47             vis[u]=0;
 48             for(int i=head[u];i;i=E[i].next)
 49             {
 50                 int v=E[i].to;
 51                 ll nw=E[i].cost+dis[u];
 52                 if(E[i].flow==0||nw<=dis[v])
 53                     continue;
 54                 dis[v]=nw;
 55                 from[v]=i;
 56                 maxF[v]=min(maxF[u],E[i].flow);
 57                 if(!vis[v])
 58                     Q.push(v);
 59                 vis[v]=1;
 60             }
 61         }
 62         return dis[T]>0;
 63     }
 64     inline void MCMF()
 65     {
 66         ll s=0;
 67         for(int i=1;i<=n;++i)
 68             for(int j=1;j<=n;++j)
 69                 s+=a[i][j];
 70         while(bfs())
 71         {
 72             int pos=T,f=maxF[T];
 73             s-=f*dis[T];
 74             while(pos!=S)
 75             {
 76                 E[from[pos]].flow-=f;
 77                 E[from[pos]^1].flow+=f;
 78                 pos=E[from[pos]^1].to;
 79             }
 80         }
 81         cout<<s<<endl;
 82     }
 83 }
 84 int main()
 85 {
 86     freopen("marshland.in","r",stdin);
 87     freopen("marshland.out","w",stdout);
 88     ios::sync_with_stdio(false);
 89     cin>>n>>m>>k;
 90     ++tot;
 91     for(int i=1;i<=n;++i)
 92         for(int j=1;j<=n;++j)
 93         {
 94             cin>>a[i][j];
 95             id1[i][j]=++tot;
 96         }
 97     for(int i=1;i<=n;++i)
 98         for(int j=1;j<=n;++j)
 99             if((i+j)&1)
100                 id2[i][j]=++tot;
101     for(int i=1;i<=k;++i)
102     {
103         int x,y;
104         cin>>x>>y;
105         ban[x][y]=1;
106     }
107     FLOW::S=0,FLOW::T=tot+1;
108     FLOW::add(0,1,0,m);
109     for(int x=1;x<=n;++x)
110         for(int y=1;y<=n;++y)
111         {
112             if(ban[x][y])
113                 continue;
114             if((x+y)&1)
115             {
116                 if(x&1)
117                 {
118                     if(id1[x-1][y]&&!ban[x-1][y])
119                         FLOW::add(id1[x][y],id1[x-1][y],0,1);
120                     if(id1[x+1][y]&&!ban[x+1][y])
121                         FLOW::add(id1[x][y],id1[x+1][y],0,1);
122                 }
123                 else
124                 {
125                     if(id1[x][y-1]&&!ban[x][y-1])
126                         FLOW::add(id1[x][y],id1[x][y-1],0,1);
127                     if(id1[x][y+1]&&!ban[x][y+1])
128                         FLOW::add(id1[x][y],id1[x][y+1],0,1);
129                 }
130                 FLOW::add(id2[x][y],id1[x][y],a[x][y],1);
131             }
132             else
133             {
134                 if(x&1)
135                 {
136                     FLOW::add(1,id1[x][y],0,1);
137                     for(int i=0;i<4;++i)
138                     {
139                         int nx=x+dx[i],ny=y+dy[i];
140                         if(ban[nx][ny]||id2[nx][ny]==0)
141                             continue;
142                         FLOW::add(id1[x][y],id2[nx][ny],0,1);
143                     }
144                 }
145                 else
146                     FLOW::add(id1[x][y],tot+1,0,1);
147             }
148         }
149     FLOW::MCMF();
150     return 0;
151 }
View Code

3.CF321D

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long int ll;
 4 const ll inf=1E15;
 5 int tot,n,len,a[55][55],r[55][55];
 6 ll ans,tmp[(1<<18)+1];
 7 inline ll what(int x,int y)
 8 {
 9     if(r[x][y]==1)
10         return -a[x][y];
11     return a[x][y];
12 }
13 inline ll get(int col)
14 {
15     ll s=0;
16     for(int i=0;i<len-1;++i)
17     {
18         r[i][col]=0;
19         r[i][col+len]=r[i][col]^r[i][len-1];
20         r[i+len][col]=r[i][col]^r[len-1][col];
21         r[i+len][col+len]=r[i+len][col]^r[i+len][len-1];
22         ll g=what(i,col)+what(i,col+len)+what(i+len,col)+what(i+len,col+len);
23         
24         r[i][col]=1;
25         r[i][col+len]=r[i][col]^r[i][len-1];
26         r[i+len][col]=r[i][col]^r[len-1][col];
27         r[i+len][col+len]=r[i+len][col]^r[i+len][len-1];
28         g=max(g,what(i,col)+what(i,col+len)+what(i+len,col)+what(i+len,col+len));
29         
30         s+=g;
31     }
32     return s;
33 }
34 inline void solve(int S)
35 {
36     ll s=0;
37     for(int i=0;i<len;++i)
38         if(S&(1<<i))
39             r[i][len-1]=1;
40         else
41             r[i][len-1]=0;
42     for(int i=len;i<n;++i)
43         r[i][len-1]=r[i-len][len-1]^r[len-1][len-1];
44     for(int i=0;i<n;++i)
45         s+=what(i,len-1);
46     for(int i=0;i<len-1;++i)
47     {
48         r[len-1][i]=0;
49         r[len-1][i+len]=r[len-1][i]^r[len-1][len-1];
50         ll g=get(i)+what(len-1,i)+what(len-1,i+len);
51         
52         r[len-1][i]=1;
53         r[len-1][i+len]=r[len-1][i]^r[len-1][len-1];
54         g=max(g,get(i)+what(len-1,i)+what(len-1,i+len));
55         
56         s+=g;
57     }
58     ans=max(ans,s);
59 }
60 int main()
61 {
62     freopen("s.in","r",stdin);
63     freopen("s.out","w",stdout);
64     ios::sync_with_stdio(false);
65     cin>>n;
66     len=(n+1)/2;
67     for(int i=0;i<n;++i)
68         for(int j=0;j<n;++j)
69             cin>>a[i][j];
70     for(int S=0;S<(1<<len);++S)
71         solve(S);
72     cout<<ans<<endl;
73     return 0;
74 }
View Code

 

[校内训练20_09_29]ABC

原文:https://www.cnblogs.com/GreenDuck/p/13749182.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!