【CodeForces训练记录】Codeforces Round 1000 (Div. 2)

训练情况

赛后反思

C题猜了个假结论WA4,每次选择度最多的删掉,在连续三个度都是最大的情况下,删中间的会寄

A题

有点前缀和的感觉,\([1,l]\) 互质个数为 \(l\),\([1,r]\) 互质个数为 \(r\),所以区间 \([l,r]\) 的个数就是 \(r-l\),特判一下 \(l=1,r=1\) 的情况答案是 \(1\)

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

void solve(){
    int l,r; cin>>l>>r;
    if(l == 1 && r == 1){
        cout<<1<<endl;
        return;
    }
    cout<<r-1-l+1<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

B题

子序列翻转,我们发现不能左右区间都选,这样翻转是无效操作,所以只能一边在 \([l,r]\),一边不在 \([l,r]\) 中去选,我们发现答案只能在 \([1,r]\)\([l,n]\) 中间取 \(r-l+1\) 个数,取最小的几个数即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n,l,r; cin>>n>>l>>r;
    vector<int> a(n + 1);
    for(int i = 1;i<=n;i++) cin>>a[i];
    vector<int> b,c,d;
    for(int i = 1;i<=n;i++){
        if(i<l) b.push_back(a[i]);
        else if(i>r) c.push_back(a[i]);
        else d.push_back(a[i]);
    }
    priority_queue<int,vector<int>,greater<int>> pq1;
    priority_queue<int,vector<int>,greater<int>> pq2;
    for(int i = 0;i<d.size();i++) pq1.push(d[i]),pq2.push(d[i]);
    for(int i = 0;i<b.size();i++) pq1.push(b[i]);
    for(int i = 0;i<c.size();i++) pq2.push(c[i]);
    int ans1 = 0,ans2 = 0;
    for(int i = 1;i<=r-l+1;i++){
        ans1 += pq1.top();
        ans2 += pq2.top();
        pq1.pop(); pq2.pop();
    }
    cout<<min(ans1,ans2)<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @ 2025-01-22 22:08  MNNUACM_2024ZY  阅读(224)  评论(0)    收藏  举报