您的位置:首页 > 其它

AtCoder Grand Contest 010

2017-10-26 21:53 435 查看
%%%leoly

%%%Visjiao

%%%Elijahqi

题解可以去看VisJiao大佬的:传送门

AtCoder Grand Contest 010

A.Addition(数学,奇偶性)

B.Boxes (数学)

C.Cleaning(树+结论)

D.Decrementing(数论+gcd+奇偶性)

都是思维题,这我哪会啊。。。Visjiao大佬的题解写的很详细orz

A.Addition

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,tot=0;
int main(){
//  freopen("a.in","r",stdin);
n=read();
for(int i=1;i<=n;++i){
int x=read();if(x&1) tot++;
}puts(tot&1?"NO":"YES");
return 0;
}


B.Boxes

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,aa
,a
,k;
ll sum=0;
int main(){
//  freopen("a.in","r",stdin);
n=read();
for(int i=1;i<=n;++i) aa[i]=read(),sum+=aa[i];
ll t=(ll)n*(n+1)/2;
if(sum%t){puts("NO");return 0;}k=sum/t;
for(int i=2;i<=n;++i) a[i]=aa[i]-aa[i-1];a[1]=aa[1]-aa
;
for(int i=1;i<=n;++i)
if((k-a[i])%n){puts("NO");return 0;}//x<0也不行啊。
else if((k-a[i])/n<0){puts("NO");return 0;}
puts("YES");return 0;
}


C.Cleaning

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,a
,h
,num=0,du
,fa
;
struct edge{
int to,next;
}data[N<<1];
bool dfs(int x){
if(du[x]==1) return 1;
ll sum=0;int mx=0;
for(int i=h[x];i;i=data[i].next){
int y=data[i].to;if(fa[x]==y) continue;
fa[y]=x;if(!dfs(y)) return 0;mx=max(mx,a[y]);sum+=a[y];
}if(a[x]>sum) return 0;if(a[x]==sum) return 1;
ll res= mx>sum-mx?sum-mx:sum/2;//内部交流最多res对
if(sum-a[x]>res||a[x]-(sum-a[x])<0) return 0;
a[x]-=sum-a[x];return 1;
}
int main(){
//  freopen("a.in","r",stdin);
n=read();for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<n;++i){
int x=read(),y=read();du[x]++;du[y]++;
data[++num].to=y;data[num].next=h[x];h[x]=num;
data[++num].to=x;data[num].next=h[y];h[y]=num;
}if(n==2){puts(a[1]==a[2]?"YES":"NO");return 0;}
for(int i=1;i<=n;++i)
if(du[i]!=1){
if(!dfs(i)) puts("NO");
else puts(a[i]?"NO":"YES");return 0;
}
}


D.Decrementing

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,a
;
ll sum=0;
inline int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
int main(){
//  freopen("a.in","r",stdin);
n=read();
for(int i=1;i<=n;++i) a[i]=read(),sum+=a[i];
if(n%2==0){
puts(sum&1?"First":"Second");return 0;
}if(sum%2==0){puts("First");return 0;}
while(1){
bool flag=0;int g=0;
for(int i=1;i<=n;++i){
if(a[i]==1||(a[i]&1&&flag)){puts("Second");return 0;}
if(a[i]&1){a[i]--;flag=1;}
g=gcd(g,a[i]);
}if((sum/=g)%2==0){puts("Second");return 0;}
for(int i=1;i<=n;++i) a[i]/=g;
flag=0;g=0;
for(int i=1;i<=n;++i){
if(a[i]==1||(a[i]&1&&flag)){puts("First");return 0;}
if(a[i]&1){a[i]--;flag=1;}
g=gcd(g,a[i]);
}if((sum/=g)%2==0){puts("First");return 0;}
for(int i=1;i<=n;++i) a[i]/=g;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: