hdu5358 ( First One )数学+思维

题目链接
题意:让你求这个公式的值。
思路:公式中最重要的就是对数,对2取对数并向下取整,那么答案就是一块一块的.
我们遍历每一个左端点 l i l_i li,对每种可能的取对数得到的值进行讨论。
假设当前对数值是 x x x,那么 x x x贡献的区间 x , y x,y x,y满足一个条件
s u m [ x ] s u m [ l i 1 ] &gt; = 2 x sum[x]-sum[l_i-1]&gt;=2^x sum[x]sum[li1]>=2x s u m [ x ] s u m [ l i 1 ] &lt; 2 x + 1 sum[x]-sum[l_i-1]&lt;2^{x+1} sum[x]sum[li1]<2x+1
把这部分的贡献加到答案里面,然后不停的找下一个位置即可。
详细细节见代码。

#include<bits/stdc++.h>

#define LL long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back

using namespace std;

LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
const int N = 1e5 +11;
LL t,n,a[N];
LL f[N][33];
LL ans,sum[N];
int main(){
    for(scanf("%d",&t);t;t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
        for(int i=n+1;i<=n+100;i++)sum[i]=sum[i-1];
        ans=0;
        for(LL i=1;i<=n;i++){
            LL l=i,pre=0,r=i;
            for(LL j=1;j<=35;j++){
                if(a[i]>=(1ll<<j)){pre=j;continue;}
                LL pos=lower_bound(sum+i+1,sum+1+n,sum[i-1]+(1ll<<j))-sum;
                r=pos;
                if(pos<=l){pre=j;continue;}
                if(pos==1+n){
                    ans+=(pre+1)*i*(n-l+1);
                    ans+=(pre+1)*(l+n)*(n-l+1)/2;
                    //cout<<j<<endl;
                    break;
                }else{
                    ans+=(pre+1)*i*(pos-l);
                    ans+=(pre+1)*(l+pos-1)*(pos-l)/2;
                    pre=j;
                    l=pos;
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务