zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",(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;
    }
    
  • 相关阅读:
    【BZOJ1006】神奇的国度(弦图)
    弦图
    【BZOJ2946】公共串(后缀数组)
    【POJ1743】Musical Theme(后缀数组)
    JAVA和Tomcat运维整理
    linux shell 之if-------用if做判断
    Linux curl命令详解
    Intel HEX文件解析
    Linux bridge-utils tunctl 使用
    怎样查询锁表的SQL
  • 原文地址:https://www.cnblogs.com/longshengblog/p/6072400.html
Copyright © 2011-2022 走看看