社区讨论
求调
P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m2o6gezb
- 此快照首次捕获于
- 2024/10/25 11:33 去年
- 此快照最后确认于
- 2025/11/04 16:15 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,x,lazy,lazy1;
};
node tr[410000];
int n,q,w,cnt=1,op,ans,num[210000],cop[210000];
void built(int l,int r,int sum)
{
tr[sum].l=l;
tr[sum].r=r;
tr[sum].lazy1=1;
if(l==r)
{
tr[sum].x=cop[cnt];
num[cnt++]=sum;
return ;
}
int mid=(l+r)/2;
built(l,mid,sum*2);
built(mid+1,r,sum*2+1);
tr[sum].x=tr[sum*2].x+tr[sum*2+1].x;
return ;
}
void powdown(int sum)
{
int lc=sum*2,rc=lc+1;
tr[lc].lazy=tr[rc].lazy=tr[sum].lazy;
tr[lc].lazy1=tr[rc].lazy1=tr[sum].lazy1;
tr[lc].x+=tr[lc].lazy*tr[lc].lazy1;
tr[rc].x+=tr[rc].lazy*tr[rc].lazy1;
tr[sum].lazy=0;tr[sum].lazy1=1;
}
void add(int l,int r,int d,int sum)
{
// cout << tr[sum].l << " " << tr[sum].r << " " << tr[sum].x << endl;
int mid=(tr[sum].l+tr[sum].r)/2;
// cout<<tr[sum].l<< ' '<<tr[sum].r<<" "<<mid<<endl;
if(tr[sum].l>=l && tr[sum].r<=r)
{
// if(tr[sum].l==tr[sum].r) cout << tr[sum].x << " " << d << endl;
tr[sum].x+=d*(tr[sum].r-tr[sum].l+1);
// cout<<tr[sum].l<< ' '<<tr[sum].r<<" "<<tr[sum].x<<endl;
tr[sum].lazy+=d;
return ;
}
if(tr[sum].lazy1!=0 || tr[sum].lazy!=0)
{
powdown(sum);
}
if(tr[sum].l==tr[sum].r)
{
tr[sum].x+=d;
return ;
}
if(l<=mid and r>mid)
{
add(l,r,d,sum*2);
add(l,r,d,sum*2+1);
tr[sum].x=tr[sum*2+1].x+tr[sum*2].x;
}
else if(l>mid)
{
add(l,r,d,sum*2+1);
tr[sum].x=tr[sum*2+1].x+tr[sum*2].x;
}
else if(r<=mid)
{
// cout<<mid<<endl;
// cout << tr[sum].l << " " << tr[sum].r << " " << tr[sum].x << endl;
add(l,r,d,sum*2);
tr[sum].x=tr[sum*2+1].x+tr[sum*2].x;
}
return ;
}
void check(int l,int r,int sum)
{
// cout << tr[sum].l << " " << tr[sum].r << " " << tr[sum].x << endl;
if(w-tr[sum].x>=0)
{
w-=tr[sum].x;
tr[sum].lazy1*=2;
tr[sum].x*=2;
ans+=tr[sum].r-tr[sum].l+1;
if(w==0)
{
ans--;
return ;
}
// cout<<w<<endl;
check(l,r,sum);
tr[sum].lazy1=1;
tr[sum*2+1].lazy1=1;
tr[sum*2].lazy1=1;
}
if(tr[sum].lazy1!=1 || tr[sum].lazy!=0)
{
powdown(sum);
}
if(l==r)
{
w-=tr[sum].x;
if(w<=0)
{
ans--;
}
tr[sum].lazy1=1;
return ;
}
int mid=(l+r)/2;
if(w-tr[sum*2].x>0)
{
w-=tr[sum*2].x;
check(mid+1,r,sum*2+1);
tr[sum*2+1].lazy1=1;
}
else
{
check(l,mid,sum*2);
tr[sum*2].lazy1=1;
}
}
int main()
{
cin>>n>>q>>w;
op=w;
for(int i=1;i<=n;i++)
{
cin>>cop[i];
}
built(1,n,1);
// for(int i=1;i<=4*n;i++)
// {
// cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].x<<"\n";
// }
// cout<<"\n";
// for(int i=1;i<=4*n;i++)
// {
// cout<<tr[i].x<<" ";
// }
for(int i=1;i<=n;i++)
{
tr[num[i]].x=cop[i];
}
int l,r,d;
for(int i=1;i<=q;i++)
{
cin>>l>>r>>d;
ans=0;
add(l,r,d,1);
// for(int j=1;j<=4*n;j++)
// {
// cout<<tr[j].l<<" "<<tr[j].r<<" "<<tr[j].x<<"\n";
// }0
// cout<<"\n";
// for(int j=1;j<=n;j++)
// {
// cout<<tr[num[i]].x<<" # ";
// }
// cout<<endl;
check(1,n,1);//问题
cout<<ans+1<<endl;
w=op;
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...