題解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('\n'); 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\n%d\n",ans,c1);
50     for(it i=1;i<=c1;++i) printf("%d ",o[i]);
51     printf("\n%d\n",c2);
52     for(it i=1;i<=c2;++i) printf("%d %d\n",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\n",ans); 
38     }
39     return 0;
40 }
View Code

 

我還是菜啊,怎么大家紛紛切E,我就E不會怎么搞。。

而且。。用血的教訓告訴大家:

1.數位dp,要判斷l=0的情況,不可以盲減一。

2.交題目的時候手速要快,不要猶豫!否則你就是交不上去的那個人……

 

由於還在system testing 先放上我沒有fst的幾題的代碼。

upd:補了下后面的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM