Codeforces Round #830 (Div. 2) C1

C1. Sheikh (Easy version)

显然对于添加一个数进入区间 是只增不减的 这就提醒了我们此题具有单调性
我们最后的答案肯定就是这一整个区间 我们考虑怎么找到最小的答案相同的区间
因为我们知道这个区间具有单调性 我们就可以暴力枚举左端点 然后二分check答案是否相同 更新区间即可

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int a[N],s[N],sx[N],n,q;
bool check(int l,int mid){
    if(s[mid]-s[l-1]-(sx[mid]^sx[l-1])==s[n]-s[0]-sx[n])return true;
    else return false;
}
void solve() {
    cin>>n>>q;
    s[0]=sx[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]+a[i];
        sx[i]=sx[i-1]^a[i];
    }
    int l1,r1;cin>>l1>>r1;
    int ans=INF,ans_l,ans_r;
    for(int i=1;i<=n;i++){
        int l=i,r=n+1;
        while(l<r){
            int mid=l+r>>1;
            if(check(i,mid))r=mid;
            else l=mid+1;
        }
        if(l==n+1)continue;
        if(l-i+1<ans){
            ans=l-i+1;
            ans_l=i,ans_r=l;
        }
    }
    cout<<ans_l<<' '<<ans_r<<endl;
}
signed main(){
    fast
    int t;t=1;cin>>t;
    while(t--) {
        solve();
    }
    return ~~(0^_^0);
}
posted @ 2022-10-25 17:22  ycllz  阅读(36)  评论(0编辑  收藏  举报