https://codeforces.com/gym/101981
Problem A. Adrien and Austin
贪心,注意细节
f[x]=1:先手必赢。
f[x]: 分成两部分(或一部分),长度分别为a和b,只要存在f[a] xor f[b]=0,则f[x]=1。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define minv 1e-6 5 #define inf 1e9 6 #define pi 3.1415926536 7 #define nl 2.7182818284 8 const ll mod=1e9+7;//998244353 9 const int maxn=1e5+10; 10 11 12 int main() 13 { 14 int n,k; 15 scanf("%d%d",&n,&k); 16 if (k==1) 17 { 18 if (n & 1) 19 printf("Adrien"); 20 else 21 printf("Austin"); 22 } 23 else if (n==0) 24 printf("Austin"); 25 else 26 printf("Adrien"); 27 return 0; 28 }
Problem D. Country Meow
三分套三分套三分
某种三分的写法是不行的!(x x+minv 精度不够)
拓展:
in k-dimension Cartesian coordinate, find a point that sum of Euclidean distance from some points to it is smallest
k次三分
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define minv 1e-8 5 #define inf 1e9 6 #define pi 3.1415926536 7 #define nl 2.7182818284 8 const ll mod=1e9+7;//998244353 9 const int maxn=1e2+10; 10 11 double dx[maxn],dy[maxn],dz[maxn],value=1e-8; 12 int n; 13 14 double Euc(int i,double xx,double yy,double zz) 15 { 16 return sqrt((dx[i]-xx)*(dx[i]-xx) + (dy[i]-yy)*(dy[i]-yy) + (dz[i]-zz)*(dz[i]-zz)); 17 } 18 19 double dist(double xx,double yy,double zz) 20 { 21 double re=0; 22 int i; 23 for (i=1;i<=n;i++) 24 re=max(re,Euc(i,xx,yy,zz)); 25 return re; 26 } 27 28 double work3(double x,double y) 29 { 30 double zl=-100000,zr=100000,z1,z2,d1,d2; 31 while (zr-zl>value) 32 { 33 z1=(zl+zr)/2; 34 z2=(z1+zr)/2; 35 d1=dist(x,y,z1); 36 d2=dist(x,y,z2); 37 if (d1>d2) 38 zl=z1; 39 else 40 zr=z2; 41 } 42 return min(d1,d2); 43 } 44 45 double work2(double x) 46 { 47 double yl=-100000,yr=100000,y1,y2,d1,d2; 48 while (yr-yl>value) 49 { 50 y1=(yl+yr)/2; 51 y2=(y1+yr)/2; 52 d1=work3(x,y1); 53 d2=work3(x,y2); 54 if (d1>d2) 55 yl=y1; 56 else 57 yr=y2; 58 } 59 return min(d1,d2); 60 } 61 62 double work1() 63 { 64 double xl=-100000,xr=100000,x1,x2,d1,d2; 65 while (xr-xl>value) 66 { 67 x1=(xl+xr)/2; 68 x2=(x1+xr)/2; 69 d1=work2(x1); 70 d2=work2(x2); 71 if (d1>d2) 72 xl=x1; 73 else 74 xr=x2; 75 } 76 return min(d1,d2); 77 } 78 79 int main() 80 { 81 int i; 82 scanf("%d",&n); 83 for (i=1;i<=n;i++) 84 cin>>dx[i]>>dy[i]>>dz[i]; 85 printf("%.10f",work1()); 86 return 0; 87 }
Problem E. Eva and Euro coins
看错题意了,难受!
Problem G. Pyramid
急需队友协助。。。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define minv 1e-6 5 #define inf 1e9 6 #define pi 3.1415926536 7 #define nl 2.7182818284 8 const ll mod=1e9+7;//998244353 9 const int maxn=1e5+10; 10 11 ll pow(ll a,ll b) 12 { 13 ll y=1; 14 while (b) 15 { 16 if (b & 1) 17 y=y*a%mod; 18 a=a*a%mod; 19 b>>=1; 20 } 21 return y; 22 } 23 24 int main() 25 { 26 int t; 27 ll sum,v,vv,n,ni2=pow(2ll,mod-2),ni3=pow(3ll,mod-2),ni4=pow(4ll,mod-2),ni6=pow(6ll,mod-2); 28 scanf("%d",&t); 29 while (t--) 30 { 31 scanf("%lld",&n); 32 sum=0; 33 sum=(sum + n*(n+1)%mod*(n+2)%mod*ni6 )%mod; 34 35 v=0; 36 v=(v + (n-1)*n%mod*(n+1)%mod*ni6 )%mod; 37 if (n & 1) 38 v=(v + (n*n-1)%mod*ni4 )%mod; 39 else 40 v=(v + (n*n)%mod*ni4 )%mod; 41 sum=(sum + v*ni2 )%mod; 42 43 v=0; 44 v=(v + (n-2)*(n-1)%mod*n%mod*(n+1)%mod*ni4 )%mod; 45 46 vv=0; 47 vv=(vv + (n-2)*(n-1)%mod*n%mod*ni6 )%mod; 48 if (n & 1) 49 vv=(vv + (n-1)*(n-1)%mod*ni4 )%mod; 50 else 51 vv=(vv + ((n-1)*(n-1)-1)%mod*ni4 )%mod; 52 v=(v + vv*3)%mod; 53 sum=(sum + v*ni6 )%mod; 54 55 printf("%lld\n",(sum+mod)%mod); 56 } 57 return 0; 58 }
Problem I. Magic Potion
网络最大流。
差点以为是上下界网络流,看到这么多人对,感觉特别诧异。。。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define minv 1e-6 5 #define inf 1e9 6 #define pi 3.1415926536 7 #define nl 2.7182818284 8 const ll mod=1e9+7;//998244353 9 const int maxn=1e3+10; 10 11 struct node 12 { 13 int d,len; 14 node *next,*opp; 15 }*e[maxn],*pre[maxn]; 16 17 queue<int> st; 18 int s,t,sum=0,add[maxn]; 19 bool vis[maxn]; 20 21 void add_edge(int x,int y,int len) 22 { 23 node *p1=(node*) malloc (sizeof(node)); 24 node *p2=(node*) malloc (sizeof(node)); 25 26 p1->d=y; 27 p1->len=len; 28 p1->next=e[x]; 29 p1->opp=p2; 30 e[x]=p1; 31 32 p2->d=x; 33 p2->len=0; 34 p2->next=e[y]; 35 p2->opp=p1; 36 e[y]=p2; 37 } 38 39 void bfs() 40 { 41 int d,dd,v; 42 node *p; 43 while (1) 44 { 45 memset(vis,0,sizeof(vis)); 46 memset(add,0,sizeof(add)); 47 add[s]=inf; 48 vis[s]=1; 49 st.push(s); 50 while (!st.empty()) 51 { 52 d=st.front(); 53 st.pop(); 54 p=e[d]; 55 while (p) 56 { 57 dd=p->d; 58 v=min(add[d],p->len); 59 if (add[dd]<v) 60 { 61 add[dd]=v; 62 pre[dd]=p->opp; 63 if (!vis[dd]) 64 { 65 vis[dd]=1; 66 st.push(dd); 67 } 68 } 69 p=p->next; 70 } 71 vis[d]=0; 72 } 73 74 if (add[t]==0) 75 return; 76 77 sum+=add[t]; 78 d=t; 79 while (d!=s) 80 { 81 pre[d]->len+=add[t]; 82 pre[d]->opp->len-=add[t]; 83 d=pre[d]->d; 84 } 85 } 86 } 87 88 int main() 89 { 90 int n,m,k,d,g,i; 91 scanf("%d%d%d",&n,&m,&k); 92 s=n+m+2,t=n+m+1; 93 add_edge(s,0,k); 94 for (i=1;i<=n;i++) 95 { 96 add_edge(s,i,1); 97 add_edge(0,i,1); 98 } 99 for (i=n+1;i<=n+m;i++) 100 add_edge(i,t,1); 101 for (i=1;i<=n;i++) 102 { 103 scanf("%d",&g); 104 while (g--) 105 { 106 scanf("%d",&d); 107 add_edge(i,n+d,1); 108 } 109 } 110 bfs(); 111 printf("%d",sum); 112 return 0; 113 }
Problem J. Prime Game
预处理一个数的所有质因数。
同一个质因数,分段处理。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define minv 1e-6 5 #define inf 1e9 6 #define pi 3.1415926536 7 #define nl 2.7182818284 8 const ll mod=1e9+7;//998244353 9 const int maxn=1e6+10; 10 11 int zhi[maxn],zys[maxn][10],s[maxn],a[maxn]; 12 bool vis[maxn]; 13 14 int main() 15 { 16 int n,g=0,value=1e6,i,j,k,l; 17 ll sum=0; 18 for (i=2;i<=value;i++) 19 { 20 if (!vis[i]) 21 { 22 zhi[++g]=i; 23 zys[i][0]=1; 24 zys[i][1]=g; 25 } 26 for (j=1;j<=g;j++) 27 { 28 k=i*zhi[j]; 29 if (k>value) 30 break; 31 if (i%zhi[j]==0) 32 { 33 zys[k][0]=zys[i][0]; 34 for (l=1;l<=zys[i][0];l++) 35 zys[k][l]=zys[i][l]; 36 } 37 else 38 { 39 zys[k][0]=zys[i][0]+1; 40 zys[k][1]=j; 41 for (l=1;l<=zys[i][0];l++) 42 zys[k][l+1]=zys[i][l]; 43 } 44 vis[k]=1; 45 if (i%zhi[j]==0) 46 break; 47 } 48 } 49 50 scanf("%d",&n); 51 for (i=1;i<=n;i++) 52 scanf("%d",&a[i]); 53 for (i=1;i<=n;i++) 54 { 55 k=a[i]; 56 for (j=1;j<=zys[k][0];j++) 57 { 58 sum+=1ll*(i-s[zys[k][j]])*(n-i+1); 59 s[zys[k][j]]=i; 60 } 61 } 62 printf("%lld",sum); 63 return 0; 64 }
Problem K. Kangaroo Puzzle
一旦两个数在一起,那么两个数之后永远都在一起
神仙方法!(看n,m数据那么小,操作次数那么多……)
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <ctime> 5 #include <cstring> 6 #include <string> 7 #include <map> 8 #include <set> 9 #include <list> 10 #include <queue> 11 #include <stack> 12 #include <vector> 13 #include <bitset> 14 #include <algorithm> 15 #include <iostream> 16 using namespace std; 17 #define ll long long 18 const int maxn=1e5+10; 19 20 char str[5]="LRUD"; 21 22 int main() 23 { 24 int g=10;//50000 25 srand(time(NULL)); 26 for (int i=1;i<=g;i++) 27 printf("%c",str[rand()%4]); 28 return 0; 29 }
Problem M. Mediocre String Problem
以待后续埋坑
网络赛也有一题Manacher的