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;
}
}

浙公网安备 33010602011771号