A——Dora's Set
直接暴力,如果a是奇数,a,a+1和a+2互质,次数加一,再从a+3开始遍历
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int l,r,cnt=0;
cin>>l>>r;
for(int i=l;i<=r;i++)
{
if(i%2==0) continue;
if(i+2<=r) i+=2,cnt++;
}
cout<<cnt<<'\n';
}
int main()
{
int t;
cin>>t;
while(t--)solve();
}
B——Index and Maximum Value
诈骗题,好好读题,如果最大值在l和r的区间内,最大值++或者--, 否则最大值不变
#include <iostream>
#include <algorithm>
#define int long long
#define For(a,b) for(int i = (a) ; i<= (b) ; i++)
#define IOS {ios::sync_with_stdio(0); cin.tie(0);}
using namespace std;
const int N = 2e5+10;
int n , m;
int a[N];
void solve(){
cin >> n >> m;
int maxa = 0;
For(1,n){
cin >> a[i];
maxa = max(maxa , a[i]);
}
char op;int l,r;
while(m--){
cin >> op;
cin >> l >> r;
if(maxa >= l && maxa <= r){
if(op == '+')maxa++;
else maxa--;
}
cout << maxa << ' ';
}
cout << '\n';
}
signed main(){
IOS
int _=1;cin >> _;
while(_--)solve();
return 0;
}
C——Dora and C++
选择一个数+a或者+b,对于任意一个数来说,其他数+a/+b就相当于该数-a/-b,故对于一个数来说,它可以变成p[i]%gcd(a,b)+k*gcd(a,b),故可以先对 p[i] 取余 gcd(a,b) 再排序,排序完成后我们就可以从小到大贪心的让每个数加上 gcd(a,b),求出处理后的p[i]+gcd(a,b)-p[i+1]的最小值即可(指针指到i时,意味着从一到i全都加上gcd(a,b)了,最小的就变成p[i+1]了)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll p[N];
void solve()
{
ll n,a,b,c,ans=1000000010;
cin>>n>>a>>b;
c=__gcd(a,b);
for(int i=1;i<=n;i++)
{
cin>>p[i];
p[i]=p[i]%c;
}
sort(p+1,p+1+n);
ans=p[n]-p[1];
for(int i=1;i<n;i++)
{
// cout<<p[i]<<'\n';
ans=min(p[i]+c-p[i+1],ans);
}
cout<<ans<<'\n';
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}