0分代码求条,玄关
查看原帖
0分代码求条,玄关
565903
ZYH_juruo楼主2024/10/22 22:01

样例过了,但是全wa

#include<bits/stdc++.h>
#define maxn 200005
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define mid ((l+r)>>1)
using namespace std;
int n,q,w,W,k;
long long s[maxn<<2],a[maxn],t[maxn<<2],b[62],pw[62];
int flag,fl;
void up(int p){
    s[p]=s[ls(p)]+s[rs(p)];
}
void build(int p,int l,int r){
    if(l==r) return s[p]=a[l],void(); 
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    up(p);
}
void add(int p,int l,int r,int x){
	s[p]+=(r-l+1)*x;
	t[p]+=x;
}
void down(int p,int l,int r){
    if(!t[p]) return;
    add(ls(p),l,mid,t[p]);
    add(rs(p),mid+1,r,t[p]);
    t[p]=0;
}
void update(int p,int l,int r,int ql,int qr,int x){
    if(qr<l||r<ql) return;
	if(ql<=l&&r<=qr) return add(p,l,r,x);
	down(p,l,r); 
	update(ls(p),l,mid,ql,qr,x);
	update(rs(p),mid+1,r,ql,qr,x);
	up(p);
}
int ask(int p,int l,int r,int num){
    if(l==r) 
    {
        if(s[p]*pw[k]<num) 
            return 1;
        else if(s[p]*pw[k]==num)
        {   
            // cout<<"   "<<p<<" "<<l<<" "<<r<<" "<<num<<endl;
            fl=1;
            return 1;
        }
        else
            return 0;
    }
    if(num>s[ls(p)]*pw[k])
        return mid-l+1+ask(rs(p),mid+1,r,num-s[ls(p)]*pw[k]);
    else if(num==s[ls(p)]*pw[k])
    {
        // cout<<"   "<<p<<" "<<l<<" "<<r<<" "<<num<<endl;
        fl=1;
        return mid-l+1;
    }
    else
        return ask(ls(p),l,mid,num);
}
int main(){
    cin>>n>>q>>W;
    for(int i=1;i<=n;i++) cin>>a[i];
    b[1]=1;for(int i=2;i<=61;i++)b[i]=2*b[i-1]+1;
    pw[0]=1;for(int i=1;i<=61;i++)pw[i]=2*pw[i-1];
    build(1,1,n);
    while(q--)
    {
        int l,r,d,ans; 
        flag=0;
        fl=0;
        w=W;
        cin>>l>>r>>d;
        update(1,1,n,l,r,d);
        for(int i=28;i>=0;i--)
        {
            if(b[i]*s[1]<w)
            {
                k=i;
                goto brk;
            }    
            if(b[i]*s[1]==w)
            {
                k=i; flag=1;
                goto brk;
            }
        }
        brk:;
        if(flag==0)
        {
            w-=b[k]*s[1];  
            ans=ask(1,1,n,w);
        } 
        // cout<<k<<" "<<w<<" "<<fl<<" "<<ans<<endl;
        if(flag==1) cout<<k*n-1<<endl;
        if(flag==0) cout<<k*n+ans-fl<<endl;
    }
    return 0;
}

2024/10/22 22:01
加载中...