社区讨论
80pts wrong on #11~14
P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m2kcw1fh
- 此快照首次捕获于
- 2024/10/22 19:22 去年
- 此快照最后确认于
- 2025/11/04 16:31 4 个月前
C
#include <iostream>
#define maxn 200001
#define int long long
using namespace std;
int n,m,hp,h,a[maxn],d[maxn<<2],lz[maxn<<2],qpow[65],l,r,lst;
void build(int l,int r,int p){
if(l==r){
if(!lst) lst=p;
d[p]=a[l];
return;
}
int mid=l+r>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
d[p]=d[p<<1]+d[p<<1|1];
}
void pd(int l,int r,int p,int k){
d[p]+=(r-l+1)*k;
lz[p]+=k;
}
void del(int l,int r,int p){
if(lz[p]&&l!=r){
int mid=l+r>>1;
pd(l,mid,p<<1,lz[p]);
pd(mid+1,r,p<<1|1,lz[p]);
lz[p]=0;
}
}
void updata(int s,int t,int k,int l,int r,int p){
if(s<=l&&r<=t){
pd(l,r,p,k);
return;
}
int mid=l+r>>1;
del(l,r,p);
if(s<=mid) updata(s,t,k,l,mid,p<<1);
if(t>mid) updata(s,t,k,mid+1,r,p<<1|1);
d[p]=d[p<<1]+d[p<<1|1];
}
bool check(int p){
int q=d[1]*qpow[p];
if(q<=hp){
h=hp-q;
return 1;
}
return 0;
}
void round(){
int mid;
while(l!=r-1){
mid=l+r>>1;
if(check(mid)) l=mid;
else r=mid;
}
if(l==0) h=hp;
return;
}
int get(int l,int r,int p,int cnt,int sum){
if(l==r){
if(h<d[lst]) return -1;
else return l-1;
}
int mid=l+r>>1;
del(l,r,p);
if(d[p<<1]*cnt>=sum) return get(l,mid,p<<1,cnt,sum);
else return get(mid+1,r,p<<1|1,cnt,sum-d[p<<1]*cnt);
}
signed main(){
int i,j,s,t;
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>hp;
for(i=1;i<=62;i++) qpow[i]=qpow[i-1]<<1|1;
for(i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
r=63;
for(i=1;i<=m;i++){
cin>>s>>t>>j;
updata(s,t,j,1ll,n,1ll);
l=0;
round();
cout<<max(l*n+get(1ll,n,1ll,1ll<<l,h),0ll)<<"\n";
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...