题目链接:http://codeforces.com/contest/979
A题:
很简单的规律题,首先人数++,偶数就是n/2,奇数就是n,别忘了考虑n等于1的情况(惨遭hack)···
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll a; scanf("%lld",&a); a++; if(a==1) { printf("0\n"); } else { if(a%2==0) printf("%lld\n",a/2); else printf("%lld\n",a); } return 0; }
B题
ppt,然后fst。。。这道题坑点有点大。大致思路是贪心算法,变子串不如变字母更优,接着就是复杂的讨论了。值得一提的是第86组数据是一种很特殊的情况,aaaaa在n等于1是长度最大是3,也就是说当n等于1且字母全相同时,长度-1。
#include<bits/stdc++.h> using namespace std; char a[3][100010]; int num[3][100]; bool cmp(int x,int y) { return x>y; } int main() { int n; scanf("%d",&n); for(int i=0;i<3;i++) { getchar(); scanf("%s",a[i]); } int len=strlen(a[0]); for(int i=0;i<3;i++) { for(int j=0;j<len;j++) num[i][a[i][j]-'A']++; } sort(num[0],num[0]+100,cmp); sort(num[1],num[1]+100,cmp); sort(num[2],num[2]+100,cmp); int max1=num[0][0]; int max2=num[1][0]; int max3=num[2][0]; int bu1=len-max1; int bu2=len-max2; int bu3=len-max3; int shi1,shi2,shi3; if(bu1>=n) shi1=max1+n; else { if(len==1) { shi1=len; } else { if(bu1==0&&n==1) shi1=len-1; else shi1=len; } } if(bu2>=n) shi2=max2+n; else { if(len==1) { shi2=len; } else { if(bu2==0&&n==1) shi2=len-1; else shi2=len; } } if(bu3>=n) shi3=max3+n; else { if(len==1) { shi3=len; } else { if(bu3==0&&n==1) shi3=len-1; else shi3=len; } } if(shi1>shi2) { if(shi1>shi3) printf("Kuro\n"); else if(shi1==shi3) { printf("Draw\n"); } else { printf("Katie\n"); } } else if(shi1==shi2) { if(shi1==shi3) printf("Draw\n"); else if(shi1>shi3) { printf("Draw\n"); } else { printf("Katie\n"); } } else { if(shi1==shi3) { printf("Shiro\n"); } else if(shi1>shi3) { printf("Shiro\n"); } else { if(shi2==shi3) { printf("Draw\n"); } else if(shi2>shi3) { printf("Shiro\n");; } else { printf("Katie\n"); } } } return 0; }
C题
比赛时想的很复杂,一直没做出来,后来看了聚聚们的题解,懂了。
若a表示x一侧的节点数,b表示y一侧的节点数,则答案就是n*(n-1)-a*b(显然)。实现过程不难,看代码即可,其实就是两个dfs。
#include<bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> g[300010]; bool used[300010]; int pre[300010]; int x,y,n; ll cnt; void dfspath(int s,int e) { used[s]=1; for(int i=0;i<g[s].size();i++) { if(g[s][i]==e) { pre[g[s][i]]=s; continue; } if(!used[g[s][i]]) { pre[g[s][i]]=s; dfspath(g[s][i],e); } } return ; } void dfsnum(int s) { cnt++; for(int i=0;i<g[s].size();i++) { if(!used[g[s][i]]) { used[g[s][i]]=1; dfsnum(g[s][i]); } } return ; } int main() { scanf("%d%d%d",&n,&x,&y); int t1,t2; for(int i=0;i<n-1;i++) { scanf("%d%d",&t1,&t2); g[t1].push_back(t2); g[t2].push_back(t1); } if(n==1) printf("0\n"); else { pre[x]=-1; dfspath(x,y); memset(used,0,sizeof(used)); for(int i=y;i!=x;i=pre[i]) used[i]=1; used[x]=1; cnt=0; dfsnum(x); ll n1=cnt; cnt=0; dfsnum(y); ll n2=cnt; printf("%lld\n",(ll)n*(ll)(n-1)-n1*n2); } return 0; }