训练情况
赛后反思
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;
}