专栏文章

题解:CF2152D Division Versus Addition

CF2152D题解参与者 4已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@minoqjal
此快照首次捕获于
2025/12/02 05:52
3 个月前
此快照最后确认于
2025/12/02 05:52
3 个月前
查看原文
博弈论太可爱了,贴贴 /se

如果没有增加的情况,那么答案显然就是 logai\log a_i 吧。
然后你发现对于一个偶数的增加实质上是无用功,只要立马除去那么就没有任何影响。
如果在不断的除法中出现了奇数且不是 11,那么我从现在开始不停地往这个数字上面堆加法,最后位数削减的速度一定没有我这个 11 左移的快。
于是这样就会多一次贡献。
所以你会发现 22 的幂次是不可能有这个机会的,其他数字都可以。
但是到此为止了吗?有个特例。
如果是 2k+12^k+1 这样的数,转成二进制就是 100001\texttt{100\dots001},那么如果是除法先施放上去则不产生贡献,如果是加法则反之。
这是一个需要争抢的资源,显然只有一半可用,单拎出来统计答案。
于是做两个前缀和就做完了。
CPP
#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;
}
// 莫妮卡只感到强烈的困惑。
// 恐怕世人做梦也万万想不到,从前威震利迪尔王国的沃岗黑龙,竟然与乌鸦展开惨绝人寰的死斗吧。

评论

3 条评论,欢迎与作者交流。

正在加载评论...