Codeforces Round #531 (Div. 3)

http://codeforces.com/contest/1102

今早上打的虚拟场。这次的div3比上次友好,但还是想写博客。昨晚是上分场,貌似错过了什么。

A:找规律即可。11001100.

B:题意有点坑。WA了一发之后觉得题意不对,发现每一个颜色都要涂上。相同的号要涂不同的颜色,简单分下号就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1000000;
int a[6000];
int v[6000][6000];
map<int,int>mp;
int main()
{
   int n,k,x;
   int maxx=0;
   while(scanf("%d%d",&n,&k)!=EOF){
        mp.clear();
        memset(v,0,sizeof(v));
        maxx=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            mp[a[i]]++;
            maxx=max(maxx,mp[a[i]]);
        }
        if(maxx>k)
            printf("NO\n");
        else{
            printf("YES\n");
            int xpp=1;
            for(int i=1;i<=n;i++){

             if(v[a[i]][xpp]==0)
             {

                 v[a[i]][xpp]=1;
                 cout<<xpp<<" ";
                 xpp++;
                 if(xpp>k)
                    xpp=1;
             }
             else{
                while(1){

                    xpp++;
                    if(xpp>k)
                        xpp=1;
                    if(v[a[i]][xpp]==0)
                    {
                        v[a[i]][xpp]=1;
                        cout<<xpp<<" ";
                        break;
                    }
                }
             }
            }
            cout<<endl;
        }
   }
}

C:比较一下X,Y的大小即可。

D:就是以替换为主。

先看0.缺0的话从左边开始替换。

再看2,缺2的话从右边开始替换

1的话有点特殊。先从右边找多的0.还缺的话再从左边找多的2.

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1000000;
int a[maxn];
int v[6000][6000];
map<int,int>mp;
int main()
{
    int n,yi,er,zero;
    string h;
    while(scanf("%d",&n)!=EOF){
        zero=0;yi=0;er=0;
        cin>>h;
        int len=h.size();
        for(int i=0;i<len;i++){
            if(h[i]=='0')
                zero++;
            else if(h[i]=='1')
                yi++;
            else
                er++;
        }
        int xpp=n/3;

        if(zero<xpp){///少0.从前往后
            for(int i=0;i<len;i++){
                if(h[i]=='1'){
                    if(yi>xpp){
                        h[i]='0';
                        zero++;
                        yi--;
                    }
                }
                else if(h[i]=='2'){
                        if(er>xpp){
                            h[i]='0';
                            zero++;
                            er--;
                        }
                }
                if(zero>=xpp)
                    break;
            }
        }

        if(er<xpp){///少2.从后往前

            for(int i=len-1;i>=0;i--){
                if(h[i]=='0')
                {
                    if(zero>xpp){
                        er++;
                        zero--;
                        h[i]='2';
                    }
                }
                else if(h[i]=='1'){
                    if(yi>xpp){
                        er++;
                        yi--;
                        h[i]='2';
                    }
                }
            if(er>=xpp)
                    break;
            }
        }
        /*
        if(yi<xpp){
           for(int i=len-1;i>=0;i--){
                if(h[i]=='2')
                {
                    if(er>xpp){
                        yi++;
                        er--;
                        h[i]='1';
                    }
                }
                else if(h[i]=='0'){
                    if(zero>xpp){
                        yi++;
                        zero--;
                        h[i]='1';
                    }
                }
                if(yi>=xpp)
                    break;
            }
        }
*/
            if(yi<xpp){
            for(int i=len-1;i>=0;i--){
                if(h[i]=='0'){
                    if(zero>xpp){
                        yi++;
                        zero--;
                        h[i]='1';
                    }
                }
                if(yi>=xpp)
                    break;
            }
        }
        if(yi<xpp){
            for(int i=0;i<len;i++){
                if(h[i]=='2')
                {
                    if(er>xpp){
                        yi++;
                        er--;
                        h[i]='1';
                    }
                }
                if(yi>=xpp)
                    break;
            }
        }
        cout<<h<<endl;
    }
}

E:看有几大块。然后是2的n次方。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1000000;
int a[maxn];
map<int,int>last;///记录i最后一次出现的位置
const LL mo=998244353;
LL power(LL a,LL n)   //a的n次方mod
{
    LL ans=1;
    a=a%mo;
    while (n)
    {
        if(n&1) ans=(ans*a)%mo;
        n>>=1;
        a=(a*a)%mo;
        }
    return ans;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            last[a[i]]=i;
        }
        int num=0;
        int maxx=0;
        for(int i=1;i<=n;i++){
             if(i>maxx)
                num++;
              maxx=max(maxx,last[a[i]]);///看最远到哪里
        }
        cout<<power(2,num-1)<<endl;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值