题目链接: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;
}