• 题解Codeforces Round #597 (Div. 2)(CF1245)


    A:送分,裸的gcd。

     1 #include<stdio.h> 
     2 #define il inline
     3 #define it register int
     4 int T,a,b,d; 
     5 il void  gcd(int a,int b){
     6     if(!b){d=a;return;}
     7     gcd(b,a%b);
     8 }
     9 il void fr(int &num){
    10     num=0;char c=getchar();int p=1;
    11     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    12     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    13     num*=p;
    14 }   
    15 int main(){
    16     fr(T);
    17     while(T--)
    18         fr(a),fr(b),gcd(a,b),d==1?puts("Finite"):puts("Infinite");  
    19     return 0;
    20 }
    View Code

    B:送分,直接把能用的都用掉就行。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define it register int
     4 #define il inline
     5 using namespace std;
     6 const int N=100005;
     7 int T,n,a,b,c,ans;
     8 char s[N],o[N]; 
     9 il void fr(int &num){
    10     num=0;char c=getchar();int p=1;
    11     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    12     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    13     num*=p;
    14 }   
    15 int main(){
    16     fr(T);
    17     while(T--){
    18         scanf("%d%d%d%d%s",&n,&a,&b,&c,s+1),ans=n;
    19         for(it i=1;i<=n;++i){
    20             if(s[i]=='S'&&a) --a,o[i]='R';
    21             else if(s[i]=='R'&&b) --b,o[i]='P';
    22             else if(s[i]=='P'&&c) --c,o[i]='S';
    23             else o[i]='K';
    24         } 
    25         for(it i=1;i<=n;++i)
    26             if(o[i]=='K'){
    27                 if(a) o[i]='R',--a;
    28                 else if(b) o[i]='P',--b;
    29                 else if(c) o[i]='S',--c;
    30                 --ans;
    31             }
    32         if(ans<((n+1)>>1)) puts("NO");
    33         else{
    34             puts("YES");
    35             for(it i=1;i<=n;++i) putchar(o[i]);putchar('
    ');
    36         }
    37     } 
    38     return 0;
    39 }
    View Code

    C:送分,手玩一下发现每个块的贡献是斐波那契数列。而且好像这题之前CF出过的。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define it register int
     4 #define il inline
     5 using namespace std; 
     6 const int N=1000005;
     7 const long long mod=1e9+7;
     8 char s[N];
     9 long long f[N],ans=1;
    10 int n; 
    11 il void fr(int &num){
    12     num=0;char c=getchar();int p=1;
    13     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    14     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    15     num*=p;
    16 }   
    17 int main(){
    18     scanf("%s",s+1),n=strlen(s+1);
    19     f[0]=f[1]=1,f[2]=2;for(it i=3;i<=n;++i) f[i]=(f[i-1]+f[i-2])%mod;
    20     for(it i=1;i<=n;++i){
    21         if(s[i]=='u'||s[i]=='n'){
    22             it j;
    23             for(j=i;s[j]==s[i]&&j<=n;++j);
    24             ans=1ll*ans*f[j-i]%mod,i=j-1;
    25         }
    26         if(s[i]=='m'||s[i]=='w'){
    27             putchar('0');return 0;
    28         }
    29     }
    30     printf("%lld",ans);  
    31     return 0;
    32 }
    View Code

    D:最小生成树,预处理每一对(i,j)的连边就行。n个点连通就跳出不做。而且这题据说是USACO某道原题。。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #define it register int
     4 #define il inline
     5 using namespace std;
     6 const int N=3005;
     7 long long ans;
     8 int n,o[N],o1[N],o2[N],c1,c2,fa[N],cnt,cnum;
     9 struct ky{
    10     int l,r;long long num;
    11     bool operator<(const ky&p)const{
    12         return num<p.num;
    13     }
    14 }a[N*N];
    15 struct str{
    16     int x,y,c,k;
    17 }b[N];
    18 il int A(it x){
    19     return x<0?-x:x;
    20 }
    21 il int dis(it i,it j){
    22     return A(b[i].x-b[j].x)+A(b[i].y-b[j].y);
    23 }
    24 il int fd(it x){
    25     return fa[x]==x?x:fa[x]=fd(fa[x]);
    26 }
    27 il void fr(int &num){
    28     num=0;char c=getchar();int p=1;
    29     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    30     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    31     num*=p;
    32 }
    33 int main(){
    34     fr(n);
    35     for(it i=1;i<=n;++i) fr(b[i].x),fr(b[i].y),fa[i]=i;fa[n+1]=n+1;
    36     for(it i=1;i<=n;++i) fr(b[i].c);
    37     for(it i=1;i<=n;++i) fr(b[i].k);
    38     for(it i=1;i<=n;++i){
    39         for(it j=i+1;j<=n;++j) a[++cnt]=(ky){i,j,1ll*dis(i,j)*(b[i].k+b[j].k)};
    40         a[++cnt]=(ky){n+1,i,b[i].c};
    41     }
    42     sort(a+1,a+1+cnt);
    43     for(it i=1,t1,t2;i<=cnt;++i){
    44         t1=fd(a[i].l),t2=fd(a[i].r);
    45         if(t1==t2) continue;
    46         fa[t1]=t2,ans+=a[i].num,++cnum,a[i].l<=n?o1[++c2]=a[i].l,o2[c2]=a[i].r:o[++c1]=a[i].r;
    47         if(cnum==n) break;
    48     }
    49     printf("%lld
    %d
    ",ans,c1);
    50     for(it i=1;i<=c1;++i) printf("%d ",o[i]);
    51     printf("
    %d
    ",c2);
    52     for(it i=1;i<=c2;++i) printf("%d %d
    ",o1[i],o2[i]);
    53     return 0;
    54 }
    View Code

    E:不会。。由于自己看不下去自己过于颓废的样子所以对着jky大佬的题解研究了一下E的做法。。这里补上啦。更好的理解:jky大佬的blog

     1 #include<stdio.h>
     2 #define it register int
     3 #define il inline
     4 #define Min(a,b)(a<b?a:b)
     5 typedef double db;
     6 const int N=15;
     7 const int n=10;
     8 struct ky{
     9     int x,y;
    10 }nxt[N][N];
    11 db f[N][N];
    12 int a[N][N];
    13 db dfs(it x,it y){
    14     if(x==1&&y==1) return 0;
    15     if(f[x][y]>=0) return f[x][y];
    16     f[x][y]=0;it now=0;
    17     register double tans=0;register ky tp;
    18     for(it i=1,tx=x,ty=y;i<=6;++i){
    19         if(tx==1&&ty==1){
    20             now=7-i;break;
    21         }
    22         tp=nxt[tx][ty],tx=tp.x,ty=tp.y,tans=dfs(tx,ty);
    23         if(a[tx][ty]) tans=Min(tans,dfs(tx-a[tx][ty],ty));
    24         f[x][y]+=tans;
    25     }
    26     return f[x][y]=(f[x][y]+6.0)/(6.0-now);
    27 }
    28 int main(){
    29     for(it i=1;i<=n;++i)
    30         for(it j=1;j<=n;++j)
    31             f[i][j]=-1e6,scanf("%d",&a[i][j]),i&1?(j==1?nxt[i][j]=(ky){i-1,j}:nxt[i][j]=(ky){i,j-1}):(j==10?nxt[i][j]=(ky){i-1,j}:nxt[i][j]=(ky){i,j+1});
    32     printf("%.10lf",dfs(10,1)); 
    33     return 0;
    34 }
    View Code

    F:数位dp。我不会告诉你我离正解只差一个特判的!

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define it register int
     4 #define il inline 
     5 using namespace std;
     6 const int N=40;
     7 typedef long long ll;
     8 ll f[N][3][3],a[N],b[N],L,R,T; 
     9 ll dfs(int now,int lim1,int lim2){
    10     if(now==-1) return 1;
    11     ll &ans=f[now][lim1][lim2];
    12     if(ans!=-1) return ans;
    13     ans=0;
    14     for(it i=0;i<=1;i++)
    15         for(int j=0;i+j<=1;j++)
    16             if((lim1||(i<=a[now])) && (lim2||(j<=b[now])))
    17                 ans+=dfs(now-1,lim1|(i<a[now]),lim2|(j<b[now])); 
    18     return ans;
    19 }
    20 il ll cal(ll l,ll r){
    21     for(it i=30;i>=0;--i)
    22         a[i]=l>>i&1,b[i]=r>>i&1;
    23     memset(f,-1,sizeof(f));
    24     return dfs(30,0,0);
    25 }    
    26 il void fr(ll &num){
    27     num=0;char c=getchar();int p=1;
    28     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
    29     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    30     num*=p;
    31 }  
    32 int main(){
    33     fr(T);
    34     while(T--){
    35         fr(L),fr(R);register ll ans=cal(R,R); 
    36         if(L) ans=ans-2*cal(L-1,R)+cal(L-1,L-1);
    37         printf("%lld
    ",ans); 
    38     }
    39     return 0;
    40 }
    View Code

    我还是菜啊,怎么大家纷纷切E,我就E不会怎么搞。。

    而且。。用血的教训告诉大家:

    1.数位dp,要判断l=0的情况,不可以盲减一。

    2.交题目的时候手速要快,不要犹豫!否则你就是交不上去的那个人……

    由于还在system testing 先放上我没有fst的几题的代码。

    upd:补了下后面的

  • 相关阅读:
    Ubuntu18.04安装PHP7.3
    常用的正则表达式大全
    python实现感知机线性分类模型
    Python-基于向量机SVM的文本分类
    ssh远程登录命令简单实例
    js页面间通信方法(storage事件)(浏览器页面间通信方法)
    Node Sass could not find a binding for your current environment 解决办法
    git上传遇到 GitHub could not read Username 的解决办法
    Vue新手村之新手村概述
    Vue新手村任务之任务前言
  • 原文地址:https://www.cnblogs.com/Kylin-xy/p/11780408.html
Copyright © 2020-2023  润新知