0 分求助
查看原帖
0 分求助
685398
ssine233楼主2024/10/20 18:47
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f3f3f3f3f;
const ll MOD=998244353;
const ll N=2e5+10;
const ll M=1e2+10;
ll n, T, m, a[N], c, u, o, f[N*4], tag[N*4], su, mc[M], tot, w1, w2;

void pd(ll rt, ll l, ll r) {
	if(tag[rt]==0)	return ;
	ll mid=(l+r)>>1;
	tag[(rt<<1)] += tag[rt];
	tag[(rt<<1)+1] += tag[rt];
	f[(rt<<1)] += tag[rt] * (mid-l+1);
	f[(rt<<1)+1] += tag[rt] * (r-mid);
	tag[rt] = 0;
}

void build(ll rt, ll l, ll r) {
	if(l==r) {
		f[rt] = a[l];
		return ;
	}	
	ll mid=(l+r)>>1;
	build((rt<<1), l, mid);
	build((rt<<1)+1, mid+1, r);
	f[rt] = f[(rt<<1)] + f[(rt<<1)+1];
}

void upd(ll rt, ll l, ll r, ll ql, ll qr, ll k) {
	if((ql<=l&&r<=qr)||l==r) {
		f[rt] += (r-l+1) * k;
		tag[rt] += k;
		return ;
	}	
	ll mid=(l+r)>>1;
	pd(rt, l, r);
	if(qr<=mid)     upd((rt<<1), l, mid, ql, qr, k);
	else if(mid<ql)    upd((rt<<1)+1, mid+1, r, ql, qr, k);
	else {
		upd((rt<<1), l, mid, ql, mid, k);
		upd((rt<<1)+1, mid+1, r, mid+1, qr, k);	
	}
	f[rt] = f[(rt<<1)] + f[(rt<<1)+1];
}

ll ask(ll rt, ll l, ll r, ll ql, ll qr) {
	if((ql<=l&&r<=qr)||l==r) 	return f[rt];
	ll mid=(l+r)>>1;
	pd(rt, l, r);
	if(qr<=mid)     return ask((rt<<1), l, mid, ql, qr);
	else if(mid<ql)    return ask((rt<<1)+1, mid+1, r, ql, qr);
	else 	return ask((rt<<1), l, mid, ql, mid) + ask((rt<<1)+1, mid+1, r, mid+1, qr);		
}

int main() {
	scanf("%lld%lld%lld", &n, &T, &m);
	mc[0] = 1LL;
	for(; mc[tot]<=m; )	mc[++tot] = mc[tot-1] << 1;
	for(ll i=0; i<=tot; i++)	mc[i]--;
	for(ll i=1; i<=n; i++)	scanf("%lld", &a[i]);
	build(1, 1, n);
	while(T--) {
		scanf("%lld%lld%lld", &c, &u, &o);			
		upd(1, 1, n, c, u, o);
		su = f[1];
		ll lc=1, rc=tot;
		while(lc<rc) {
			ll mid=(lc+rc)>>1;
			w1=mc[mid], w2=su;
			if(w1<w2)	swap(w1, w2);
			if(w1<(m+w2-1)/w2)	lc = mid+1;
			else				rc = mid;
		}
		ll ln=1, rn=n;
		while(ln<rn) {
			ll mid=(ln+rn)>>1;
			w1=ask(1, 1, n, 1, mid), w2=(mc[lc-1]+1);
			if(w1<w2)	swap(w1, w2);
			if(w1<((m-mc[lc-1]*su)+w2-1)/w2)	ln = mid+1;
			else				rn = mid;			
		}
		printf("%lld\n", (lc-1)*n+ln-1);
	}
	return 0;
}

为何 0 分(WA + RE + TLE

2024/10/20 18:47
加载中...