• Codeforces Round #581 (Div. 2)


    A:暴力。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     6 typedef long long ll;
     7 using namespace std;
     8  
     9 const int N=1010;
    10 int n;
    11 char s[N];
    12  
    13 int main(){
    14     scanf("%s",s+1); n=strlen(s+1); bool flag=0;
    15     rep(i,2,n) if (s[i]=='1') flag=1;
    16     if (s[1]=='0'){ puts("0"); return 0; }
    17     if (flag) printf("%d",(n+1)/2); else printf("%d
    ",n/2);
    18     return 0;
    19 }
    A

    B:一定是1,2,4,...,2^k。最小和最大分别让1和2^k最多即可。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     6 typedef long long ll;
     7 using namespace std;
     8  
     9 int n,l,r;
    10  
    11 int main(){
    12     cin>>n>>l>>r;
    13     ll s1=n-l+1; rep(i,1,l-1) s1+=1ll<<i;
    14     ll s2=(1ll<<(r-1))*(n-r+1); rep(i,0,r-2) s2+=1ll<<i;
    15     cout<<s1<<' '<<s2<<endl;
    16     return 0;
    17 }
    B

    C:先floyd求最短路,然后每次找到当前点至多往后多少个点可以保证p走的一直都是最短路,然后走到那个点去。由于p如果某时刻走的不是最短路了,那么之后走的一定也都不是最短路。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     6 typedef long long ll;
     7 using namespace std;
     8  
     9 const int N=1010,M=2000010,inf=1e8;
    10 char s[N];
    11 int n,m,tot,f[N][N],p[M],q[M];
    12  
    13 int main(){
    14     scanf("%d",&n);
    15     rep(i,1,n) rep(j,1,n) f[i][j]=inf;
    16     rep(i,1,n) f[i][i]=0;
    17     rep(i,1,n){
    18         scanf("%s",s+1);
    19         rep(j,1,n) if (s[j]=='1') f[i][j]=1;
    20     }
    21     rep(k,1,n) rep(i,1,n) rep(j,1,n) f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    22     scanf("%d",&m);
    23     rep(i,1,m) scanf("%d",&p[i]);
    24     for (int i=1,j; i<m; i=j){
    25         q[++tot]=p[i];
    26         rep(k,i+1,m) if (f[p[i]][p[k]]==k-i) j=k; else break;
    27     }
    28     printf("%d
    ",tot+1);
    29     rep(i,1,tot) printf("%d ",q[i]); printf("%d
    ",p[m]);
    30     return 0;
    31 }
    C

    D1/D2:首先0不会变成1,然后考虑1变成0的必要条件并证明它是充分的。1能变成0,当且仅当存在一个以这个位置开头的子序列,满足它是这个位置到n的LIS。于是边倒着DP做LIS边判断每个1是否可以变成0即可。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     6 typedef long long ll;
     7 using namespace std;
     8  
     9 const int N=100010;
    10 char s[N],s2[N];
    11 int n,sm,ans[N],f[N][2];
    12  
    13 int main(){
    14     scanf("%s",s+1); n=strlen(s+1);
    15     rep(i,1,n) s2[i]=s[i];
    16     for (int i=n; i; i--){
    17         if (s[i]=='0') f[i][0]=max(f[i+1][0],f[i+1][1])+1,f[i][1]=f[i+1][1],sm++;
    18             else f[i][1]=f[i+1][1]+1,f[i][0]=f[i+1][0];
    19         ans[i]=max(f[i][0],f[i][1])-sm;
    20     }
    21     for (int i=n; i; i--) if (ans[i]!=ans[i+1]) s2[i]='0';
    22     rep(i,1,n) putchar(s2[i]);
    23     return 0;
    24 }
    D

    E:考虑求F[i]表示最大前缀和不小于i的数列个数,最后差分一下即可求出期望。先给结论:F[i]=C(n+m,n-i)。归纳证明,若数列最后一个数是-1,则前n+m-1个数的最大前缀和一定是i,这部分的贡献是C(n+m-1,n-i)。若是1,由于不能保证这个1一定在最大前缀和里,于是前n+m-1个数的最大前缀和仍然是i,这部分的贡献是C(n+m-1,n-i-1)。于是F[i]=C(n+m-1,n-i)+C(n+m-1,n-i-1)=C(n+m,n-i)。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     4 typedef long long ll;
     5 using namespace std;
     6  
     7 const int N=4010,mod=998244853;
     8 int n,m,ans,x,y,C[N][N];
     9  
    10 int main(){
    11     scanf("%d%d",&n,&m); C[0][0]=1;
    12     rep(i,1,n+m){ C[i][0]=1; rep(j,1,i) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; }
    13     for (int i=n; i && i>=n-m; i--) x=(C[n+m][n-i]-y+mod)%mod,ans=(ans+1ll*x*i)%mod,y=(y+x)%mod;
    14     printf("%d
    ",ans);
    15     return 0;
    16 }
    E
  • 相关阅读:
    UVALive
    BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
    BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)
    51nod1674:区间的价值2(分治,利用&和|的收敛性)
    [CQOI2009]DANCE跳舞
    [HNOI2006]超级英雄
    Luogu1613 跑路
    [HZOI 2016]公路修建
    [NOI2014]魔法森林
    [HAOI2006] 旅行
  • 原文地址:https://www.cnblogs.com/HocRiser/p/11393677.html
Copyright © 2020-2023  润新知