蒟蒻的补题日记——CF969

90 阅读2分钟

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]p[i]来说,它可以变成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;
}