hud5358 数学,指针

本文探讨了一种解决特定数学问题的高效算法,通过优化复杂度至nlogn,避免了传统nlogn*logn方法导致的时间超限。算法采用区间和预处理,结合枚举技巧和双指针策略,实现复杂度优化。实例代码展示了具体实现步骤,适用于类似问题的解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:soda has an integer array a1,a2,,an. Let S(i,j) be the sum of ai,ai+1,,aj. Now soda wants to know the value below:
i=1nj=in(log2S(i,j)+1)×(i+j)

Note: In this problem, you can consider log2(0) as 0.

比赛时只想到n*logn*logn的做法,会T掉,必须写出nlogn的方法。

由于区间和在[1<<k,1<<(k+1)]之间的上式前部分总为k,枚举k,求区间和在[L,R)内的所有i+j之和,枚举区间起始位置i,用两个指针,一个标记从i开始的区间起点,一个标记从i开始的区间终点,这样即使i递增,两个指针也无需更新,因此复杂度是O(n).

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int maxn=100005;
int n;
ll d[maxn];
ll sum[maxn];
ll solve(ll L,ll R)
{
    ll ans=0;
    int l=1,r=0;
    for(int i=1;i<=n;i++) {
        if(l<i) l=i;
        if(r<i-1) r=i-1;
        while(l<=n && sum[l]-sum[i-1]<L) {
            l++;
        }
        if(l==n+1)
            break;
        while(r<n && sum[r+1]-sum[i-1]<R) {
            r++;
        }
        if(l>r)
            continue;
        ans+=i*(r-l+1);
        ans+=(ll)(r-l+1)*(l+r)/2;
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--) {
        scanf("%d",&n);
        sum[0]=0;
        for(int i=1;i<=n;i++) {
            scanf("%d",&d[i]);
            sum[i]=sum[i-1]+d[i];
        }
        ll ans=0;
        for(int i=1;i<35;i++) {
            ans+=(ll)(i)*solve((1ll<<(i-1)),(1ll<<i));
        }
        ans+=solve(0,1);
        printf("%lld\n",ans);
    }
    return 0;
}


log2
代码完全和上次不一样啊你就不能看一下吗,这个你能大胆的猜测推理联想反编译出来内容吗,这个是一个绘制圆圈的函数、 Engine::DrawCircle(DrawCircleParam, a, aa.技能宽度, &newcolor, (QWORD*)&v34, (int*)&v12);代码完全不一样__int64 __fastcall sub_1408A2560(__int64 a1, __int64 a2, float a3, __int64 a4, _QWORD *a5, int *a6) { __int64 result; // rax float v10; // xmm1_4 float v11; // xmm6_4 float v12; // xmm8_4 float v13; // xmm7_4 __int64 v14; // rbx bool v15; // zf float v16; // xmm2_4 float v17; // xmm3_4 float v18; // xmm5_4 float v19; // xmm1_4 float v20; // xmm9_4 float v21; // xmm7_4 int v22; // edi int v23; // eax int v24; // r9d int v25; // edi int v26; // ebx int v27; // eax int v28; // r9d __int64 v29; // rax __int64 v30; // [rsp+38h] [rbp-99h] BYREF int v31[2]; // [rsp+40h] [rbp-91h] BYREF float v32; // [rsp+48h] [rbp-89h] float v33; // [rsp+58h] [rbp-79h] BYREF float v34; // [rsp+60h] [rbp-71h] int v35; // [rsp+64h] [rbp-6Dh] int v36; // [rsp+68h] [rbp-69h] int v37; // [rsp+6Ch] [rbp-65h] float v38; // [rsp+70h] [rbp-61h] float v39; // [rsp+78h] [rbp-59h] int v40; // [rsp+7Ch] [rbp-55h] int v41; // [rsp+80h] [rbp-51h] int v42; // [rsp+84h] [rbp-4Dh] float v43; // [rsp+88h] [rbp-49h] float v44; // [rsp+90h] [rbp-41h] __int64 v45; // [rsp+94h] [rbp-3Dh] int v46; // [rsp+9Ch] [rbp-35h] float v47; // [rsp+A0h] [rbp-31h] float v48; // [rsp+A8h] [rbp-29h] __int64 v49; // [rsp+ACh] [rbp-25h] int v50; // [rsp+B4h] [rbp-1Dh] __int64 savedregs; // [rsp+120h] [rbp+4Fh] BYREF result = sub_1408BF050(); if ( (_BYTE)result ) { v10 = *((float *)a6 + 2); v31[0] = *a6; v32 = v10; v31[1] = 0; sub_140FCD930(v31); v37 = -16777216; v11 = *(float *)v31 * a3; v42 = -16777216; v12 = -(float)(v32 * a3); v13 = v32 * a3; v46 = -16777216; v50 = -16777216; sub_14088B200(&v33, a2, a4); v14 = *(_QWORD *)sub_1408B9590(a1, &savedregs); v30 = v14; if ( v14 ) { sub_141129CC0(v14); v14 = v30; } v15 = *a5 == 0i64; v16 = v12 + v11; v35 = 1065353216; v17 = v13 + v11; v36 = 1065353216; v41 = 1065353216; v18 = v11 - v13; v19 = v34 - (float)(v13 + v11); v20 = v11 - v12; v21 = v13 - v11; v33 = v33 - (float)(v12 + v11); v34 = v19; v39 = v39 + v18; v38 = v38 + (float)(v12 - v11); if ( v15 ) { v22 = qword_141C5EC58; v40 = -1082130432; v45 = 0xBF8000003F800000ui64; v43 = v43 + v20; v44 = v44 + v21; v49 = 0xBF800000BF800000ui64; v48 = v48 + v17; v47 = v47 + v16; v23 = sub_1411B0D60("SAMPLER0"); LOBYTE(v24) = 2; sub_141134FF0(v14, v23, v22 + 8, v24, 2); sub_141165A60(qword_141C44120, a1, (unsigned int)&v33, 4, 3, (__int64)&v30); v25 = v30; v26 = qword_141C5EC58; v27 = sub_1411B0D60("SAMPLER0"); LOBYTE(v28) = 1; result = sub_141134FF0(v25, v27, v26 + 8, v28, 1); } else { v40 = 0; v45 = 1065353216i64; v49 = 0i64; v43 = v43 + v20; v44 = v44 + v21; v47 = v47 + v16; v48 = v48 + v17; v29 = sub_1411B0D60("SAMPLER0"); sub_141134F50(v14, v29, a5); result = sub_141165A60(qword_141C44120, a1, (unsigned int)&v33, 4, 3, (__int64)&v30); } if ( v30 ) result = sub_1411228E0(v30); } if ( *a5 ) return sub_141122630(); return result; }这个你能大胆的猜测推理联想反编译出来内容吗,这个是一个绘制圆圈的函数、 Engine::DrawCircle(DrawCircleParam, a, aa.技能宽度, &newcolor, (QWORD*)&v34, (int*)&v12);
最新发布
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值