社区讨论

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 条回复,欢迎继续交流。

正在加载回复...