• [校内训练20_09_29]ABC


    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
  • 相关阅读:
    [QT][待解决问题]对话框ui载入卡顿问题
    [QT] Tab键切换焦点顺序
    [QT][问题记录]发布软件时遇到的问题
    [QT][转载] Qt信号和槽
    [QT][转载]Qt:使用C++还是QML
    [qt][问题记录] 无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll
    [QT]安装中出现的问题(安装qt5.8,出现Could not start:"{0,3010,1603,5100} msiexec ...")
    [转载]Lwip之IP/MAC地址冲突检测
    转载:TCP连接的状态详解以及故障排查
    git push (第一次) (转)
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/13749182.html
Copyright © 2020-2023  润新知