• Educational Codeforces Round 5


    616A - Comparing Two Long Integers    20171121

    直接暴力莽就好了...没什么好说的

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    string a,b;int sa,sb;
    char cmp()
    {
        if(sa==-1 && sb==-1)return '=';
        if(sa==-1)return '<';if(sb==-1)return '>';
        if(a.size()-sa>b.size()-sb)return '>';
        if(a.size()-sa<b.size()-sb)return '<';
        for(int i=sa,j=sb;i<a.size();i++,j++)
          if(a[i]!=b[j])return (a[i]<b[j])?'<':'>';
        return '=';
    }
    int main()
    {
        cin>>a;cin>>b;sa=sb=-1;
        for(int i=0;i<a.size();i++)if(a[i]!='0'){sa=i;break;}
        for(int i=0;i<b.size();i++)if(b[i]!='0'){sb=i;break;}
        return printf("%c
    ",cmp()),0;
    }
    View Code

    616B - Dinner with Emma    20171121

    在每行的最小值中取一个最大值输出就好了

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,x,mi,ans;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          {
          mi=2147483647;
          for(int j=1;j<=m;j++)
            scanf("%d",&x),mi=min(mi,x);
          ans=max(ans,mi);
          }
        return printf("%d
    ",ans),0;
    }
    View Code

    616C - The Labyrinth    20171121

    简单并查集

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #define N 1150
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct rua
    {
        int x,y;
    }fa[N][N];
    int n,m,si[N][N];
    bool s[N][N];
    char ch;
    bool read()
    {
        ch=getchar();
        while(ch!='.' && ch!='*')
          ch=getchar();
        return ch=='.';
    }
    rua Find(int x,int y)
    {
        if(fa[x][y].x==x && fa[x][y].y==y)return fa[x][y];
        else return fa[x][y]=Find(fa[x][y].x,fa[x][y].y);
    }
    void Union(int xx,int xy,int yx,int yy)
    {
        fa[Find(xx,xy).x][Find(xx,xy).y]=Find(yx,yy);
    }
    bool equal(int xx,int xy,int yx,int yy)
    {
        return fa[xx][xy].x==fa[yx][yy].x && fa[xx][xy].y==fa[yx][yy].y;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            fa[i][j].x=i,fa[i][j].y=j;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            {
            s[i][j]=read();
            if(s[i][j] && s[i-1][j])
              Union(i,j,i-1,j);
            if(s[i][j] && s[i][j-1])
              Union(i,j,i,j-1);
            }
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            {
            fa[i][j].x=Find(i,j).x;
            fa[i][j].y=Find(i,j).y;
            si[Find(i,j).x][Find(i,j).y]++;
            }
        for(int i=1;i<=n;i++)
          {
          for(int j=1;j<=m;j++)
            if(s[i][j])
              printf(".");
            else
              {
              int ans=1;
              if(s[i-1][j])
                ans+=si[Find(i-1,j).x][Find(i-1,j).y];
              if(s[i+1][j])
                if(!equal(i+1,j,i-1,j))
                  ans+=si[Find(i+1,j).x][Find(i+1,j).y];
              if(s[i][j-1])
                if(!equal(i,j-1,i-1,j))
                  if(!equal(i,j-1,i+1,j))
                    ans+=si[Find(i,j-1).x][Find(i,j-1).y];
              if(s[i][j+1])
                if(!equal(i,j+1,i-1,j))
                  if(!equal(i,j+1,i+1,j))
                    if(!equal(i,j+1,i,j-1))
                      ans+=si[Find(i,j+1).x][Find(i,j+1).y];
              printf("%d",ans%10);
              }
          printf("
    ");
          }
        return 0;
    }
    View Code

    616D - Longest k-Good Segment    20171121

    先找出当(l=1)时(r)的最大值,然后O(n)扫一遍。即先增大(l)的值到刚好不同元素个数(<k),之后再增大(r)的值,这种做法在CF中好像叫做(two pointers),在Educational Codeforces Round 50的D题里也有此算法的一个应用

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #define N 1000001
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int ansl,ansr,n,k,l,r,s,a[N],b[N];
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
          scanf("%d",&a[i]);
        for(r=1;s<=k && r<=n;r++)
          s+=(!b[a[r]]),b[a[r]]++;
        r--;if(s>k)s--,b[a[r--]]--;
        l=ansl=1,ansr=r;
        while(r<n)
          {
          for(l;s==k;l++)
            b[a[l]]--,s-=(!b[a[l]]);
          for(r=r+1;s<=k && r<=n;r++)
            s+=(!b[a[r]]),b[a[r]]++;
          r--;if(s>k)s--,b[a[r--]]--;
          if(s==k && ansr-ansl<r-l)
            ansr=r,ansl=l;
          }
        printf("%d %d
    ",ansl,ansr);
    }
    View Code

    616E - Sum of Remainders    20171121

    直接分块做就好了

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define LL long long
    #define MOD 1000000007
    LL n,m,nexti,ans,an;
    LL get_ans(LL a,LL b,LL n)
    {
        if(n&1)an=((n+1)/2)%MOD*(n%MOD)%MOD;
        else an=(n/2)%MOD*((n+1)%MOD)%MOD;
        an*=a%MOD,an%=MOD,an+=(n+1)%MOD*(b%MOD)%MOD;
        return an%MOD;
    }
    int main()
    {
        scanf("%I64d%I64d",&n,&m);
        for(LL i=1;i<=min(m,n);i=nexti+1)
          {
          nexti=min(m,n/(n/i));
          ans+=get_ans(n/i,n%nexti,((n%i)-(n%nexti))/(n/i));
          ans%=MOD;
          }
        if(n<m)ans+=(m-n)%MOD*(n%MOD)%MOD;
        printf("%I64d
    ",ans%MOD);
        return 0;
    }
    View Code

    616F - Expensive Strings    20180917

    [Educational Round 5][Codeforces 616F. Expensive Strings]

  • 相关阅读:
    python os一些相关操作
    查看linux系统占用的端口号
    asp.net 2.0
    winform oracle
    winform sql server 增删查改
    CPTW移仓程序Procedure
    创建一个类,实现只会实例化一次。
    javascript静态页面传值的三种方法,让你一次爽个够!
    点击链接或按钮使框架页面整体跳出到指定的页面
    javascript动态添加控件
  • 原文地址:https://www.cnblogs.com/DeaphetS/p/9670694.html
Copyright © 2020-2023  润新知