Codeforces Round #532

以后不放水题了

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/10275757.html