CFRound#379(div2)
题目链接:http://codeforces.com/contest/734
A:SB题。
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 100005 using namespace std; int n,num1,num2; char s[maxn]; int main(){ scanf("%d",&n);scanf("%s",s+1); for(int i=1;i<=n;i++)if(s[i]=='A')num1++;else num2++; if(num1>num2)puts("Anton"); else if(num1<num2)puts("Danik"); else puts("Friendship"); return 0; }
B:SB题。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int k2,k3,k5,k6,sum; int main(){ scanf("%d%d%d%d",&k2,&k3,&k5,&k6); sum=256*min(min(k5,k6),k2); k2-=min(min(k5,k6),k2); sum+=32*min(k3,k2); printf("%d\n",sum); return 0; }
C:由于题目中第二种魔法是递增的,所以只要枚举第一种魔法用哪一个,二分第二种就好了。。
但我SB的没有看到递增。。所以我把两个都排序后两个指针扫一遍。
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 200005 using namespace std; int n,m,k,x,s,mx[maxn]; long long ans; struct fuck{int x,y;}p1[maxn]; struct pps{int x,y;}p2[maxn]; bool comp(fuck x,fuck y){return x.y<y.y;} bool cmp(pps x,pps y){return x.y<y.y;} int read(){ int x=0,f=1;char ch; for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } int main(){ n=read();m=read();k=read();x=read();s=read(); ans=8e18; for(int i=1;i<=m;i++)p1[i].x=read(); for(int i=1;i<=m;i++)p1[i].y=read(); for(int i=1;i<=k;i++)p2[i].x=read(); for(int i=1;i<=k;i++)p2[i].y=read(); sort(p1+1,p1+m+1,comp);sort(p2+1,p2+k+1,cmp); for(int i=1;i<=k;i++)mx[i]=max(mx[i-1],p2[i].x); p1[0].x=x; for(int i=0,j=k;i<=m;i++){ while(1ll*p2[j].y+p1[i].y>s&&j>=0)j--; if(j>=0)ans=min(ans,1LL*max(n-mx[j],0)*p1[i].x); } printf("%lld\n",ans); return 0; }
D:恶心模拟题。。。(一遍敲对,好爽啊)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,a,b,p[9][4]; char s[3]; int read(){ int x=0,f=1;char ch; for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } int main(){ n=read();a=read();b=read(); for(int i=1,x,y;i<=n;i++){ scanf("%s",s+1);x=read();y=read();int z; if(s[1]=='R')z=2;else if(s[1]=='B')z=1;else z=3; if(x==a&&y<b&&(y>p[1][1]||p[1][3]==0))p[1][0]=x,p[1][1]=y,p[1][3]=z; if(x==a&&y>b&&(y<p[5][1]||p[5][3]==0))p[5][0]=x,p[5][1]=y,p[5][3]=z; if(y==b&&x<a&&(x>p[3][0]||p[3][3]==0))p[3][0]=x,p[3][1]=y,p[3][3]=z; if(y==b&&x>a&&(x<p[7][0]||p[7][3]==0))p[7][0]=x,p[7][1]=y,p[7][3]=z; if(a-x==b-y&&x<a&&(x>p[2][0]||p[2][3]==0))p[2][0]=x,p[2][1]=y,p[2][3]=z; if(a-x==b-y&&x>a&&(x<p[6][0]||p[6][3]==0))p[6][0]=x,p[6][1]=y,p[6][3]=z; if(a+b==x+y&&x<a&&(x>p[4][0]||p[4][3]==0))p[4][0]=x,p[4][1]=y,p[4][3]=z; if(a+b==x+y&&x>a&&(x<p[8][0]||p[8][3]==0))p[8][0]=x,p[8][1]=y,p[8][3]=z; } bool bo=0; if(p[1][3]>1||p[3][3]>1||p[5][3]>1||p[7][3]>1)bo=1; if(p[2][3]==1||p[2][3]==3||p[4][3]==1||p[4][3]==3||p[6][3]==1||p[6][3]==3||p[8][3]==1||p[8][3]==3)bo=1; if(bo)puts("YES");else puts("NO"); return 0; }
E:考虑把同颜色的联通块缩点,那么缩点后一定是黑白相间的。我们可以从直径中间开始变色,那么ans=(直径长度+1)/2.
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 200005 using namespace std; int n,ans,col[maxn],tot,h[maxn],way[maxn*2],Next[maxn*2]; int read(){ int x=0,f=1;char ch; for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } void insert(int x,int y){way[++tot]=y;Next[tot]=h[x];h[x]=tot;} int dfs(int x,int fa){ int mx=0,cx=0; for(int j=h[x];j;j=Next[j])if(way[j]!=fa){ int y=dfs(way[j],x); if(col[x]!=col[way[j]])y++; if(y>mx)cx=mx,mx=y; else if(y>cx)cx=y; } ans=max(ans,mx+cx); return mx; } int main(){ n=read(); for(int i=1;i<=n;i++)col[i]=read(); for(int i=1,x,y;i<n;i++){ x=read();y=read(); insert(x,y);insert(y,x); } dfs(1,0);printf("%d\n",(ans+1)/2); return 0; }
F:只要想到a&b+a|b==a+b就好写了。设sum为sigma{a[i]},则b[i]+c[i]=a[i]*n+sum。把a[i]算出来,再判断是否合法就好了。
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 200005 using namespace std; typedef long long ll; ll n,sum,a[maxn],b[maxn],c[maxn],w[65]; ll read(){ ll x=0,f=1;char ch; for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } int main(){ n=read(); for(int i=1;i<=n;i++)b[i]=read(),sum+=b[i]; for(int i=1;i<=n;i++)c[i]=read(),sum+=c[i]; if(sum%(2*n)){puts("-1");return 0;} sum/=2*n; for(int i=1;i<=n;i++){ if((b[i]+c[i]-sum)%n){puts("-1");return 0;} a[i]=(b[i]+c[i]-sum)/n; if(b[i]>n*a[i]||c[i]<n*a[i]){puts("-1");return 0;} } for(int i=1;i<=n;i++) for(int j=0;j<=60;j++) w[j]+=a[i]>>j&1; for(int i=1;i<=n;i++){ ll p=0,pp=0; for(int j=0;j<=60;j++) if(a[i]>>j&1)p+=w[j]*(1ll<<j),pp+=n*(1ll<<j); else pp+=w[j]*(1ll<<j); if(p!=b[i]&&pp!=c[i]){puts("-1");return 0;} } for(int i=1;i<=n;i++)printf("%lld ",a[i]);puts(""); return 0; }