Codeforces Round #379 (Div. 2)

来源:互联网 发布:淘宝网如何注销账户 编辑:程序博客网 时间:2024/04/30 22:16

链接:http://codeforces.com/contest/734

A题:水题

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000100;int n;char s[maxn];int main(){    cin>>n>>s;    int A=0;    for(int i=0;i<n;i++){        if(s[i]=='A') A++;        else A--;    }    if(A==0) puts("Friendship");    else if(A>0) puts("Anton");    else puts("Danik");    return 0;}
B题:水题

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000100;int k2,k3,k5,k6;int main(){    cin>>k2>>k3>>k5>>k6;    int a=min(k2,min(k5,k6));    int b=min(k2-min(k5,k6),k3);    if(b<0) b=0;    cout<<(a*256+b*32)<<endl;    return 0;}
C题:水题,用set维护一下就好了。

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000100;const int INF=1e9+10;int n,m,k;struct Node{int a,b;friend bool operator<(Node A,Node B){return A.b<B.b;}};Node A[maxn],B[maxn];int x,s;int main(){//freopen("in.txt","r",stdin);//cout<<(int)(1e9)*4<<endl;while(~scanf("%d%d%d",&n,&m,&k)){scanf("%d%d",&x,&s);for(int i=1;i<=m;i++) scanf("%d",&A[i].a);for(int i=1;i<=m;i++) scanf("%d",&A[i].b);for(int i=1;i<=k;i++) scanf("%d",&B[i].a);for(int i=1;i<=k;i++) scanf("%d",&B[i].b);set<int> S;sort(A+1,A+m+1);sort(B+1,B+k+1);ll res=1LL*x*n;int now=1;for(int i=m;i>=1;i--){if(A[i].b>s) continue;while(now<=k&&1LL*B[now].b+A[i].b<=s) S.insert(B[now++].a);if(S.size()==0) res=min(res,1LL*A[i].a*n);else{set<int>::iterator it=S.end();--it;res=min(res,1LL*max(0,n-(*it))*A[i].a);}}for(int i=now;i<=k;i++){if(B[i].b<=s) res=min(res,1LL*x*max(0,n-B[i].a));}printf("%lld\n",res);}return 0;}
D题:水题,直接找八个方向最近的模拟判断一下就好了

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000100;const int INF=1e9+10;int n;struct Node{char op[2];int x,y;};Node A,p[8],pt;int Dir(Node A,Node B){int res=-1;int tx=A.x-B.x,ty=A.y-B.y;if(tx==0||ty==0||abs(tx)==abs(ty)){if(tx==0) return ty<0?0:1;if(ty==0) return tx<0?2:3;if(tx<0) return ty<0?4:5;if(tx>0) return ty<0?6:7;}return -1;}char OP(int dir){if(dir<=3) return 'R';return 'B';}ll dist(Node A,Node B){ll tx=A.x-B.x,ty=A.y-B.y;return abs(tx)+abs(ty);}int main(){//freopen("in.txt","r",stdin);while(cin>>n){scanf("%d%d",&A.x,&A.y);for(int i=0;i<8;i++) p[i].op[0]='#';for(int i=1;i<=n;i++){scanf("%s%d%d",pt.op,&pt.x,&pt.y);int dir=Dir(pt,A);if(dir==-1) continue;if(p[dir].op[0]=='#') p[dir]=pt;char op=OP(dir);if(pt.op[0]=='Q') pt.op[0]=op;ll D_ptA=dist(pt,A),D_pA=dist(p[dir],A);if(D_ptA<D_pA) p[dir]=pt;else if(D_ptA==D_pA){if(pt.op[0]==op) p[dir]=pt;}}bool flag=0;for(int i=0;i<8;i++){if(OP(i)==p[i].op[0]) flag=1;}puts(flag?"YES":"NO");}return 0;}
E题:水题,直接加权求树的直径,黑白交界的点权值为1,其余为0,答案就是直径的一半,连缩点都不用。

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000100;const int INF=1e9+10;#define PII pair<int,int>int n;int val[maxn];vector<int> G[maxn];int u,v;PII dfs(int u,int f){PII res=make_pair(0,u);if(f==0) res.first=1;else if(val[u]!=val[f]) res.first=1;PII tmp=make_pair(0,0);for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==f) continue;PII t=dfs(v,u);if(tmp.second==0) tmp=t;else tmp=max(tmp,t);}if(tmp.second) res.second=tmp.second,res.first+=tmp.first;return res;}int dfs2(int u,int f){int res=0;if(f==0||val[u]!=val[f]) res=1;int tmp=0;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==f) continue;tmp=max(tmp,dfs2(v,u));}return res+tmp;}int main(){//freopen("in.txt","r",stdin);while(~scanf("%d",&n)){for(int i=1;i<=n;i++) scanf("%d",&val[i]),G[i].clear();for(int i=1;i<n;i++){scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}int rt=dfs(1,0).second;int d=dfs2(rt,0);printf("%d\n",d/2);}return 0;}
F题:利用b+c=b&c+b|c的性质,求出数组a,显然a是唯一的,最后再判断a的合法性,注意逐步按位判断,利用二进制的性质避开n^2的无脑暴力。

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1000100;const int INF=1e9+10;int n;ll a[maxn],b[maxn],c[maxn];ll s[40];int main(){//freopen("in.txt","r",stdin);while(cin>>n){ll sum=0;for(int i=1;i<=n;i++) scanf("%lld",&b[i]),sum+=b[i];for(int i=1;i<=n;i++) scanf("%lld",&c[i]),sum+=c[i];if(sum%(2*n)){puts("-1");continue;}sum/=2*n;bool flag=1;for(int i=1;i<=n;i++){if(b[i]+c[i]-sum<0||(b[i]+c[i]-sum)%n){flag=0;break;}a[i]=(b[i]+c[i]-sum)/n;}if(!flag){puts("-1");continue;}for(int i=0;i<40;i++){s[i]=0;for(int j=1;j<=n;j++) s[i]+=(a[j]&(1LL<<i));}for(int i=1;i<=n;i++){ll add_B=0,add_C=0;for(int j=0;j<40;j++){if(a[i]&(1LL<<j)) add_B+=s[j],add_C+=(1LL<<j)*n;else add_C+=s[j];if((add_B&(1LL<<j))!=(b[i]&(1LL<<j))){flag=0;break;}if((add_C&(1LL<<j))!=(c[i]&(1LL<<j))){flag=0;break;}}if(!flag) break;}if(!flag){puts("-1");continue;}for(int i=1;i<=n;i++) printf("%lld%c",a[i],i==n?'\n':' ');}return 0;}

0 0
原创粉丝点击