Codeforces Round #395 (Div. 2) 解题报告
年后恢复训练参加的第一场,表现的不是很好,必须要赶紧振作起来了啊。
A、B题不再赘述。
C题
不要被树的形式吓到,实际上不需要换根DFS,只需要看两顶点颜色不同的线段即可。
1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream> 4 using namespace std; 5 typedef long long ll; 6 typedef unsigned long long ull; 7 int k=0,n,i; 8 int color[100005],st[100005],en[100005],ge[100005]; 9 int main() 10 { 11 scanf("%d",&n); 12 for(i=0;i<n-1;i++) 13 { 14 scanf("%d %d",&st[i],&en[i]); 15 } 16 for(i=1;i<=n;i++) 17 { 18 scanf("%d",&color[i]); 19 } 20 for(i=0;i<n-1;i++) 21 { 22 if(color[st[i]]!=color[en[i]]) 23 { 24 k++; 25 ge[st[i]]++; 26 ge[en[i]]++; 27 } 28 } 29 for(i=1;i<=n;i++) 30 { 31 if(ge[i]==k) 32 { 33 printf("YES\n"); 34 printf("%d\n",i); 35 return 0; 36 } 37 } 38 printf("NO\n"); 39 return 0; 40 }
D题
构造法,按矩形左下角横纵坐标奇偶性填颜色即可。(易证这样即可)
1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream> 4 using namespace std; 5 typedef long long ll; 6 typedef unsigned long long ull; 7 int n; 8 int lx[500005],ly[500005]; 9 int main() 10 { 11 int i,tem1,tem2; 12 scanf("%d",&n); 13 for(i=0;i<n;i++) 14 { 15 scanf("%d %d %d %d",&lx[i],&ly[i],&tem1,&tem2); 16 lx[i]=abs(lx[i]); 17 ly[i]=abs(ly[i]); 18 } 19 printf("YES\n"); 20 for(i=0;i<n;i++) 21 { 22 if(lx[i]%2==0&&ly[i]%2==0) 23 printf("1\n"); 24 else if(lx[i]%2==1&&ly[i]%2==0) 25 printf("2\n"); 26 else if(lx[i]%2==0&&ly[i]%2==1) 27 printf("3\n"); 28 else 29 printf("4\n"); 30 } 31 }
E题
“ 大概就是,考虑任取Ai和Aj,作差Ai-Aj,这个差的值只和AiAj在等差数列中的位置差有关(d*(pi-pj)%m)。如果位置差pi-pj不同,d*(pi-pj)一定也不同(这里用到了n*2<m)。由于d*1和d*-1会出现n-1次,d*2和d*-2会出现n-2次……,所以可以用差值出现的次数来确定d,确定d之后随便搞了”
1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream> 4 using namespace std; 5 typedef long long ll; 6 typedef unsigned long long ull; 7 int n,m; 8 int a[100005],b[100005]; 9 int he_1=0,he_2=0; 10 int d,x,he,oh; 11 int fastmi(int n,int m,int k) 12 { 13 int re=1; 14 while(m) 15 { 16 if(m&1) 17 { 18 re=1LL*re*n%k; 19 } 20 m>>=1; 21 n=1LL*n*n%k; 22 } 23 return re; 24 } 25 int main() 26 { 27 scanf("%d %d",&m,&n); 28 int i; 29 for(i=0;i<n;i++) 30 { 31 scanf("%d",&a[i]); 32 he_1=(he_1+a[i])%m; 33 he_2=(he_2+1LL*a[i]*a[i])%m; 34 } 35 if(n==1) 36 { 37 printf("%d 0\n",a[0]); 38 return 0; 39 } 40 if(n==m) 41 { 42 printf("0 1\n"); 43 return 0; 44 } 45 sort(a,a+n); 46 oh=fastmi(n,m-2,m); 47 // printf("he1= %d\n",he_1); 48 // printf("he2= %d\n",he_2); 49 for(i=1;i<n;i++) 50 { 51 // printf("aishi %d\n",a[i]); 52 d=(a[i]-a[0]+m)%m; 53 //// printf("%d\n",fastmi(n,m-2,m)); 54 // x=1LL*(he_1-(1LL*n*(n-1)/2)%m*d%m+m)%m*oh%m;//算得此时首项 55 //// printf("x=%d\n",x); 56 // he=(n*x%m*x%m+1LL*n*(n-1)%m*x%m*d%m+1LL*n*(n-1)*(2*n-1)/6*d%m*d%m)%m; 57 //// printf("he=%d\n",he); 58 59 x=1LL*(he_1-1LL*n*(n-1)/2%m*d%m+m)*oh%m; 60 int tmp=1LL*n*x%m*x%m; 61 tmp=(tmp+1LL*n*(n-1)%m*d%m*x%m)%m; 62 tmp=(tmp+1LL*n*(n-1)*(2*n-1)/6%m*d%m*d%m)%m; 63 64 if(tmp==he_2) 65 { 66 b[0]=x; 67 for(int j=1;j<n;j++) 68 { 69 b[j]=(b[j-1]+d)%m; 70 } 71 sort(b,b+n); 72 int s; 73 for(s=0;s<n;s++) 74 { 75 if(b[s]!=a[s]) 76 break; 77 } 78 // printf("s=%d\n",s); 79 if(s==n) 80 { 81 printf("%d %d\n",x,d); 82 return 0; 83 } 84 } 85 } 86 printf("-1\n"); 87 88 }