Poi 的新加法(Hard Version)

题目链接:https://ac.nowcoder.com/acm/contest/109080/F

题意:

规定f运算f(x,y)=x+y- x xor y

给定q次循环,求[l,r]范围内数组进行f运算结果

思路:

需要知道 x+y= x xor y + (x&y)<<1

那么f(x,y)= (x&y)<<1

在[l,r]上,由于一开始两个数合取后会左移一位,这意味着1的最低位至少为 1位(0位由于左移,值为0)

每次往右运算的过程中,发现最低位每次都会增加一位,因此运算超过60个数则整个运算的值变为0,那么答案就是0,直接返回即可了

void solve(){
    cin>>n>>q;
    vector<int>a(n+1);
    rep(i,1,n){
        cin>>a[i];
    }
    vector<int>pre(n+1);
    int ans=0;
    if(n>=2){
        pre[1]=a[1];
        rep(i,2,n){
        pre[i]=(pre[i-1]&a[i])<<1;
        }
    }
    while(q--){
        int l,r;cin>>l>>r;
        if(l==r){
            cout<<a[l]<<endl;continue;
        }
        if(l==1){
            cout<<pre[r]<<endl;continue;
        }
        int ans=a[l];
        for(int i=l+1;i<=r;i++){
            ans=(ans&a[i])<<1;
            if(ans==0)break;
        }
        cout<<ans<<endl;
    }
}
posted @ 2025-05-16 21:42  Marinaco  阅读(22)  评论(0)    收藏  举报
//雪花飘落效果