Codeforces Round 1069 (Div. 2)

因为各种原因,最近几天的做题量与强度有所下降,时间不多了希望未来可以更加努力,以此为戒

B

image

 这一套的难度感觉划分的不太对,这个B题反而比C题难得多

这个B题的思维还是挺巧妙的,显然是个构造,我竟然没有想出来

异或这个知识点有时候和前缀和,后缀和联系挺紧密

构造规则是造一个数组1-n,ai

给出两个端点l,r在l,l+1,l+2,r这个区间里面,异或和为0,其余都不准为0

如果思考一个前缀和异或

F(a,b)=pre[a-1]^pre[b]

也就有

F(l,r)=pre[l-1]^pre[r]=0,也就是pre[l-1]=pre[r]

然后就没有了,我们强制规则一下这两个pre相等即可,然后pre[i]=i就可以解决问题,好巧妙

C

读题到Accepted只用了20分钟,这才是合格的acmer(虽然题目很水)

image

 两个字符串你要把t排序一下,然后让t中存在子序列=s

你有两种选择往当前ans里面push S字符串的当前位置,或者push进去当前最小的其他不重要的字符

当时思考到问题就是在s字符穿内部把t的字符都插入进去,贪心一下即可

void solve(){
    string t,s,ans;cin>>s>>t;
    map<char,int>mp;
    for(auto it:t)mp[it]++;
    for(auto it:s){
        mp[it]--;
        if(mp[it]<0){
            cout<<"Impossible"<<endl;
            return ;
        }
    }
    vector<char>st;
    for(auto i='a';i<='z';i++)for(int j=1;j<=mp[i];j++)st.push_back(i);
    int stl=0,sl=0;
    while(ans.size()<t.size()){
        if(stl==st.size()){
            ans.push_back(s[sl++]);
        }
        else if(sl==s.size()){
            ans.push_back(st[stl++]);
        }else{
            if(st[stl]<s[sl]){
                ans.push_back(st[stl++]);
            }else{
                ans.push_back(s[sl++]);
            }
        }
    }
    cout<<ans<<endl;
    return ;
}

D(待补)

posted @ 2025-12-11 00:13  zhzhzhao  阅读(11)  评论(0)    收藏  举报