以后不放水题了
C.NN and the Optical Illusion
复习一下高中数学即可
$frac{ans}{ans+r}=sin frac{pi}{n}$
解方程
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const double pai=acos(-1); 7 int n,d; double a; 8 int main() 9 { 10 scanf("%d%d",&n,&d),a=pai/n; 11 printf("%f",sin(a)*d/(1-sin(a))); 12 return 0; 13 }
D.Dasha and Chess
先走到中间,然后背对着车最少的那个角落走,根据咕咕原理可知这边最少有 666*3/4=499.5— —也就是500 只车,而走过去只需要499步,所以一定能被将到;总步数最多499+499步
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1000; 6 pair<int,int> rook[N]; 7 int t1,t2,t3,kx,ky,mini; 8 int ocp[N][N],cnt[2][2]; 9 void Check() 10 { 11 if(t1<=0) exit(0); 12 } 13 void Move(int xx,int yy) 14 { 15 kx+=xx,ky+=yy; 16 if(ocp[kx][ky]) kx-=xx; 17 printf("%d %d ",kx,ky),fflush(stdout); 18 scanf("%d%d%d",&t1,&t2,&t3),Check(); 19 int rx=rook[t1].first,ry=rook[t1].second; 20 ocp[rx][ry]=false,rook[t1]=make_pair(t2,t3),ocp[t2][t3]=true; 21 } 22 int main() 23 { 24 scanf("%d%d",&kx,&ky),mini=1e9; 25 for(int i=1;i<=666;i++) 26 { 27 scanf("%d%d",&t1,&t2); 28 rook[i]=make_pair(t1,t2),ocp[t1][t2]=true; 29 } 30 while(kx<500) Move(1,0); 31 while(kx>500) Move(-1,0); 32 while(ky<500) Move(0,1); 33 while(ky>500) Move(0,-1); 34 for(int i=1;i<=999;i++) 35 for(int j=1;j<=999;j++) 36 if(ocp[i][j]) cnt[i>500][j>500]++; 37 for(int i=0;i<=1;i++) 38 for(int j=0;j<=1;j++) 39 if(cnt[i][j]<mini) mini=cnt[i][j]; 40 for(int i=0;i<=1;i++) 41 for(int j=0;j<=1;j++) 42 if(cnt[i][j]==mini) 43 while(true) Move(i?-1:1,j?-1:1); 44 return 0; 45 }
E.Andrew and Taxi
首先一定有解,构造方法是所有边都是小编号指向大编号,那么二分答案对大于答案的边跑拓扑排序检验即可
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005; 6 struct a 7 { 8 int u,v,w; 9 }edg[N]; 10 int p[N],noww[N],goal[N]; 11 int deg[N],idx[N],que[N],outp[N]; 12 int n,m,f,b,t1,t2,t3,cnt,num,ans; 13 void Link(int f,int t) 14 { 15 noww[++cnt]=p[f],p[f]=cnt; 16 goal[cnt]=t,deg[t]++; 17 } 18 bool Nocir(int x) 19 { 20 num=0,cnt=0,f=0,b=-1; 21 memset(p,0,sizeof p); 22 memset(deg,0,sizeof deg); 23 for(int i=1;i<=m;i++) 24 if(edg[i].w>x) 25 Link(edg[i].u,edg[i].v); 26 for(int i=1;i<=n;i++) 27 if(!deg[i]) que[++b]=i; 28 while(f<=b) 29 { 30 int tn=que[f++]; idx[tn]=++num; 31 for(int i=p[tn];i;i=noww[i]) 32 if(!(--deg[goal[i]])) 33 que[++b]=goal[i]; 34 } 35 for(int i=1;i<=n;i++) 36 if(deg[i]) return false; 37 return true; 38 } 39 int main() 40 { 41 scanf("%d%d",&n,&m); 42 for(int i=1;i<=m;i++) 43 { 44 scanf("%d%d%d",&t1,&t2,&t3); 45 edg[i]=(a){t1,t2,t3},ans=max(ans,t3); 46 } 47 int l=0,r=ans; 48 while(l<=r) 49 { 50 int mid=(l+r)/2; 51 if(Nocir(mid)) r=mid-1,ans=mid; 52 else l=mid+1; 53 } 54 Nocir(ans); 55 for(int i=1;i<=m;i++) 56 if(edg[i].w<=ans&&idx[edg[i].u]>idx[edg[i].v]) 57 outp[++outp[0]]=i; 58 printf("%d %d ",ans,outp[0]); 59 for(int i=1;i<=outp[0];i++) 60 printf("%d ",outp[i]); 61 return 0; 62 }
F.Ivan and Burgers
恭喜出题人获得了“出到原题”成就
然后就被踩标算了
1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=500005,K=32; 7 vector<pair<int,int> > ve[N]; 8 vector<pair<int,int> > ::iterator it; 9 int n,m,t1,t2,val[N],ans[N],bas[K],pos[K]; 10 void Insert(int x,int y) 11 { 12 for(int i=21;~i;i--) 13 if(x&(1<<i)) 14 { 15 if(!bas[i]) 16 { 17 bas[i]=x,pos[i]=y; 18 return; 19 } 20 if(y>pos[i]) 21 swap(x,bas[i]),swap(y,pos[i]); 22 x^=bas[i]; 23 } 24 } 25 int main() 26 { 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++) 29 scanf("%d",&val[i]); 30 scanf("%d",&m); 31 for(int i=1;i<=m;i++) 32 { 33 scanf("%d%d",&t1,&t2); 34 ve[t2].push_back(make_pair(t1,i)); 35 } 36 for(int i=1;i<=n;i++) 37 { 38 Insert(val[i],i); 39 for(it=ve[i].begin();it!=ve[i].end();it++) 40 { 41 int lef=it->first,idx=it->second; 42 for(int j=21;~j;j--) 43 if(pos[j]>=lef&&(ans[idx]^bas[j])>ans[idx]) 44 ans[idx]^=bas[j]; 45 } 46 } 47 for(int i=1;i<=m;i++) 48 printf("%d ",ans[i]); 49 return 0; 50 }