CF969

A

方法

直接每一次选择一个两个奇数和偶数即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int l,r; cin>>l>>r;
int num=0;
for (int i = l; i < r+1; ++i)
{
if(i&1) num++;
}
cout<<(num)/2<<"\n";
}
int main()
{
int t=1;
cin>>t;
for(int i=1;i<=t;i++)
{
//cout<<"case "<<t<<": ";
solve();
}
return 0;
}

B

方法

如果是增加,那么最大数肯定还是原来的那一个。如果是减少,肯定是会比其他没有减少的数大,所以只需要对最大数进行操作即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n; cin>>n;
int m; cin>>m;
std::vector<int> v(n,0);
for (int i = 0; i < n; ++i)
{
cin>>v[i];
}
int maxn=0;
for (int i = 0; i < n; ++i)
{
maxn=max(maxn,v[i]);
}
for (int i = 0; i < m; ++i)
{
char opt; cin>>opt;
int l,r; cin>>l>>r;
if(l<=maxn && maxn<=r)
{
if(opt=='+') maxn++;
else maxn--;
}
cout<<maxn<<" \n"[i==n-1];
}
}
int main()
{
int t=1;
cin>>t;
for(int i=1;i<=t;i++)
{
//cout<<"case "<<t<<": ";
solve();
}
return 0;
}

C

方法

ab可以由他们两者的最大公约数构成。可以通过多次操作使得一个数相对于其他数增加了gcd(a,b),那么对每个数%gcd(a,b),然后进行维护即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n; cin>>n;
ll a,b; cin>>a>>b;
ll div=gcd(a,b);
std::vector<ll> v(n,0);
for (int i = 0; i < n; ++i)
{
cin>>v[i];
}
if(div==1)
{
cout<<"0\n";
return;
}
set<ll> s;
for (int i = 0; i < n; ++i)
{
s.insert(v[i]%div);
}
int m=s.size();
ll ans=(*s.rbegin())-(*s.begin());
for (int i = 0; i < m; ++i)
{
int cur=*s.begin();
s.insert(*s.begin()+div);
s.erase(cur);
ans=min(ans,(*s.rbegin())-(*s.begin()));
}
cout<<ans<<"\n";
}
int main()
{
int t=1;
cin>>t;
for(int i=1;i<=t;i++)
{
//cout<<"case "<<t<<": ";
solve();
}
return 0;
}