• 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

      

  • 相关阅读:
    HDU 3714 Error Curves【三分查找】【经典题】
    HDU 3714 Error Curves【三分查找】【经典题】
    HDU 3711 Binary Number【水题】【bitset】
    HDU 3711 Binary Number【水题】【bitset】
    HDU 4689 Derangement【DP递推】【好题】【思维题】
    HDU 4689 Derangement【DP递推】【好题】【思维题】
    HDU 4055 Number String【DP递推+递推优化】【好题】
    HDU 4055 Number String【DP递推+递推优化】【好题】
    HDU 4054 Hexadecimal View【模拟】【字符串处理】
    HDU 4054 Hexadecimal View【模拟】【字符串处理】
  • 原文地址:https://www.cnblogs.com/HQHQ/p/5967860.html
Copyright © 2020-2023  润新知