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 }
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 }
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 }
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 }
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 }
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 }
我还是菜啊,怎么大家纷纷切E,我就E不会怎么搞。。
而且。。用血的教训告诉大家:
1.数位dp,要判断l=0的情况,不可以盲减一。
2.交题目的时候手速要快,不要犹豫!否则你就是交不上去的那个人……
由于还在system testing 先放上我没有fst的几题的代码。
upd:补了下后面的