题解:CF2152D Division Versus Addition
fish_love_cat · · 题解
博弈论太可爱了,贴贴 /se
如果没有增加的情况,那么答案显然就是
然后你发现对于一个偶数的增加实质上是无用功,只要立马除去那么就没有任何影响。
如果在不断的除法中出现了奇数且不是
于是这样就会多一次贡献。
所以你会发现
但是到此为止了吗?有个特例。
如果是
这是一个需要争抢的资源,显然只有一半可用,单拎出来统计答案。
于是做两个前缀和就做完了。
#include<bits/stdc++.h>
#define mk make_pair
#define pb push_back
#define mod 998244353
#define int long long
using namespace std;
int sum[250005];
int sum2[250005];
void solve(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++){
int x;
cin>>x;
int flc=x,kel=1;
int cnt=0;
while(flc)cnt++,flc>>=1;
kel<<=cnt-1;
sum[i]=sum[i-1]+cnt-(x-kel<=1);
sum2[i]=sum2[i-1]+(x-kel==1);
}
while(q--){
int l,r;
cin>>l>>r;
cout<<sum[r]-sum[l-1]+(sum2[r]-sum2[l-1])/2<<'\n';
}
}
signed main(){
int t=1;
cin>>t;
while(t--)solve();
return 0;
}
// 莫妮卡只感到强烈的困惑。
// 恐怕世人做梦也万万想不到,从前威震利迪尔王国的沃岗黑龙,竟然与乌鸦展开惨绝人寰的死斗吧。