zoukankan      html  css  js  c++  java
  • Codeforces Round #376 (Div. 2)

    T1:

      题意:给你一个环,从‘a'-->'b'--->'c'--->....--->'z'---'a'

         然后开始于’a',给你一串字符,求从‘a'开始一直依次走字符要走多少步

      题解:模拟

    T2:

      题意:给你n个数字,你可以给这个数字-2(无数个)或者自己-1,自己后面一个数-1,问是否能全部为0;

      题解:模拟

    T3:  

      题意:给你一些袜子,每个袜子有自己的颜色,然后给你很多对(x-y)希望将(x-y)染成同一种颜色,求最小染色步数

      题解:并查集+线段树

    T4:

      题意:给你一些字符串,然后给你一种移动规则:移动一步,每个字符%m+1; 求最小移动步数使得字符串大小按字典序排序

      题解:将一些不和法区间弄出来用线段树或者差分维护即可

    T5:  

      题意:两个人轮流按某个规则取数(从左向右取数字可以取【2--n】个,获得权值为数字和,同时取完后在最左边加一个权值为数字和的数

         希望先手-后手的差最大[两个人绝顶聪明]

      题解:设一个dp[i]表示从i--n中开始先手先取的最大差值

         dp[i]=max(sum[j]-dp[j]) i+1<=j<=n 

         于是考虑从后往前做可将时间优化为O[n]的 

    T6  

      题意:给你一些数字,你可以选择其中一个不动的数字X,其他数字可以删减使得所有数为X的倍数,求所有数字之和的最大值!

      题解:考虑一个数一定在X*(j-1)和X*(j)之中,因为不能+所以一定会变为X*(j-1)所以我只需要知道X*(J-1)--X*j中有多少个数字存在原数列中

         时间复杂度为n*log(maxn) 可能重复出现某个数字,于是我们用vis记录一下即可!

    代码集合: 

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    using namespace std;
    char s[105];
    int n;
    int read()
    {
        int x=0,f=1; char ch;
        while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
        while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
        return x*f;
    }
    int main()
    {
        scanf("%s",s+1); n=strlen(s+1);
        char p='a'; int ans=0;
        for (int i=1; i<=n; i++)
        {
            ans+=min(abs(s[i]-p),26-abs(p-s[i])); p=s[i];
        }
        cout<<ans<<endl;
        return 0;
    }
    A
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    using namespace std;
    int n;
    int a[200005];
    int read()
    {
        int x=0,f=1; char ch;
        while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
        while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
        return x*f;
    }
    int main()
    {
        n=read(); 
        bool bo=true;
        for (int i=1; i<=n; i++)
        {
            a[i]=read()-a[i-1];
            if (a[i]<0) {bo=false; break;}
            a[i]=(a[i]-a[i]/2*2); 
            if (a[i]==0) continue;
            if (i==n) {bo=false;}
        }
        if (bo) cout<<"YES"<<endl; else cout<<"NO"<<endl;
        return 0;
    }
    B
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #define N 210005
    using namespace std;
    int n,m,k;
    int fa[N],a[N],b[N],col[N],tot,ans=0;
    int sum[N*6];
    vector<int>rec[N];
    int read()
    {
        int x=0,f=1; char ch;
        while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
        while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
        return x*f;
    }
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    void clear(int k,int l,int r)
    {
        if (l==r){sum[k]=0; return;}
        int mid=(l+r)>>1;
        if (sum[k*2]!=0) clear(k*2,l,mid);
        if (sum[k*2+1]!=0) clear(k*2+1,mid+1,r);
        sum[k]=0;
    }
    void change(int k,int l,int r,int x)
    {
        if (l==r){sum[k]++; return ;}
        int mid=(l+r)>>1;
        if (x<=mid) change(k*2,l,mid,x);
        else change(k*2+1,mid+1,r,x);
        sum[k]=max(sum[k*2],sum[k*2+1]);
    }
    int main()
    {
        n=read(); m=read(); k=read();
        for (int i=1; i<=n; i++) col[i]=read();
        for (int i=1; i<=n; i++) fa[i]=i;
        for (int i=1; i<=m; i++)
        {
            int x=read(),y=read(); 
            int fx=find(x),fy=find(y);
            if (fx!=fy) fa[fx]=fy;
        }
        for (int i=1; i<=n; i++) fa[i]=find(i);
        for (int i=1; i<=n; i++) 
        {
            rec[fa[i]].push_back(i);
            if (fa[i]==i) tot++,b[tot]=fa[i]; 
         }
         for (int i=1; i<=tot; i++)
         {
             int x=b[i]; clear(1,1,k);
             for (int j=0; j<rec[x].size(); j++)
             {
                 change(1,1,k,col[rec[x][j]]);
            }
            int tmp=sum[1];
            ans+=rec[x].size()-tmp;
        }
        printf("%d
    ",ans);
        return 0;
    }
    C
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #define N 1000010
    using namespace std;
    int n,m,sum[N],a[N];
    vector<int>rev[N];
    int read()
    {
        int x=0,f=1; char ch;
        while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
        while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
        return x*f;
    }
    void ins(int l,int r){sum[l]++;sum[r+1]--;}
    void solve(int k)
    {
        int tot=min(a[k],a[k+1]);
        for (int i=0; i<tot; i++)
        {
            int x=rev[k][i],y=rev[k+1][i];
            if (x!=y)
            {
                if (x<y) ins(m-y+1,m-x);
                else ins(0,m-x),ins(m-y+1,m-1);
                return ;
            }
        }
        if (a[k]>a[k+1]) {cout<<-1<<endl; exit(0);}
    }
    int main()
    {
        n=read(); m=read();
        for (int i=1; i<=n; i++)
        {
            a[i]=read(); for (int j=1; j<=a[i]; j++) rev[i].push_back(read());
        }
        for (int i=1; i<n; i++) solve(i);
        int tmp=0;
        for (int i=0; i<m; i++)
        {
            tmp+=sum[i];
            if (!tmp) {printf("%d
    ",i); return 0;}
        }
        printf("-1
    ");
        return 0;
    }
    D
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #define N 200005
    using namespace std;
    int n;
    int a[N],sum[N],f[N];
    int read()
    {
        int x=0,f=1; char ch;
        while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
        while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
        return x*f;
    }
    int main()
    {
        n=read(); 
        for (int i=1; i<=n; i++) sum[i]=sum[i-1]+read();
        int fuckls=sum[n];
        for (int i=n-1; i>=1; i--)
        {
            f[i]=fuckls;
            fuckls=max(fuckls,sum[i]-f[i]);
        }
        cout<<f[1]<<endl;
    }
    E
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #define ll long long 
    #define N 200005
    using namespace std;
    bool vis[N];
    int a[N],n;
    ll ans;
    int read()
    {
        int x=0,f=1; char ch;
        while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
        while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
        return x*f;
    }
    int main()
    {
        n=read();
        for (int i=1; i<=n; i++) a[i]=read();
        sort(a+1,a+n+1);
        for (int i=1; i<=n; i++)
        {
            ll maxn=0;
            if (vis[a[i]]) continue; vis[a[i]]=1;
            for (int j=a[i]; j<=a[n]; j+=a[i])
            {
                int tmp=a[i]+j;
                int l=lower_bound(a+1,a+n+1,j)-a;
                int r=lower_bound(a+1,a+n+1,tmp)-a;
                maxn+=1ll*(r-l)*j;
            }
            ans=max(ans,maxn);
         } 
         printf("%I64d
    ",ans);
         return 0;
    }
    F

      

  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/HQHQ/p/5967860.html
Copyright © 2011-2022 走看看