Codeforces Round 1022 (Div. 2) A-C

总体来说前三题比正常难度简单,后三题比正常难度难,且D是个交互。

所以就基本是手速场了,就看ABC过的速度。

A. Permutation Warm-Up

猜结论

观察样例guess一下,比如1234

就是反转序列,4321,再给每一位相减的和的绝对值/2+1.

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;
    int ans=0;

    for(int i=1;i<=n;i++){
        ans+=abs(n-i+1-i);
    }

    cout<<ans/2+1<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

B. SUMdamental Decomposition

位运算+乱搞

主要就是让凑出来的每一个数的二进制位中,只有一个1.

赛时写了依托,缝缝补补到最后都不知道前面的思路是什么,反正就是过了hh

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n,x;
    cin>>n>>x;

    if(n==1 && x==0){
        cout<<-1<<endl;
        return;
    }

    int cnt1=0;
    int ans=0;

    int tmp=x;
    int cnt=0;
    int mul=1;
    while(tmp){
        if(tmp&1){
            cnt++;
            ans+=mul;
            if(mul!=1) cnt1++;
        }
        mul*=2;
        tmp/=2;
    }

    int diff=n-cnt;
    tmp=n;

    // cout<<"ans: "<<ans<<endl;

    if(cnt>=n){
        cout<<ans<<endl;
        return;
    }

    // cout<<"diff: "<<diff<<endl;

    if((diff%2)==0){
        ans+=diff;
        cout<<ans<<endl;
        return;
    }else{
        ans+=diff-1;

        if(cnt1){
            cout<<ans+2<<endl;
            return;
        }

        int i=0;
        bool f=0;
        if(diff>1) f=1;
        while(1){
            if(((x>>i)&1) || f){
                f=0;
                i++;
            }
            else{
                ans+=2*(1<<i);
                // cout<<"2*(1<<i)  "<<i<<endl;

                cout<<ans<<endl;
                return;
            }
        }
    }

    cout<<"false"<<endl;
}   

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

C. Neo's Escape

思路更是显然,只要统计数组中先递增再递减的连续数的个数。比如 1 2 3 2 1就是一个

实现有很多中方法,赛时写了码量最大的双向量表,绷不住了明明有更简单的写法的,有写了依托。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;

    vector<int> a(n+10),ne(n+10),pr(n+10);
    vector<pii> pos;
    
    for(int i=1;i<=n;i++){
        cin>>a[i];
        ne[i]=i+1;
        pr[i]=i-1;
        pos.push_back({a[i],i});
    }

    ne[n]=0;
    pr[1]=0;

    sort(pos.begin(),pos.end(),greater<pii>());


    int sum=n;
    int ans=0;

    for(auto [val,idx]:pos){
        // cout<<"entry: "<<idx<<endl;
        if(a[idx]==-1) continue;
        sum--;
        ans++;
        // cout<<"ans++"<<endl;

        while(1){
            int tar=0;
            int taridx=0;
            if(ne[idx]){
                if(a[ne[idx]]>tar && val>=a[ne[idx]]){
                    tar=a[ne[idx]];
                    taridx=ne[idx];
                }
            }
            if(pr[idx]){
                if(a[pr[idx]]>tar && val>=a[pr[idx]]){
                    tar=a[pr[idx]];
                    taridx=pr[idx];
                }
            }
            if(tar<=0) break;

            if(taridx==ne[idx]){
                pr[taridx]=pr[idx];
                ne[pr[idx]]=taridx;
            }else if(taridx==pr[idx]){
                ne[taridx]=ne[idx];
                pr[ne[idx]]=pr[idx];
            }

            a[idx]=-1;
            sum--;
            idx=taridx;
            val=tar;
            a[taridx]=-1;
            // cout<<taridx<<" ";
        }
        if(sum==0){
            a[idx]=-1;
            break;
        }

    }
    cout<<ans<<endl;
}   

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}
posted @ 2025-05-04 17:39  LYET  阅读(50)  评论(0)    收藏  举报