75tps求助
查看原帖
75tps求助
141335
qwq2519楼主2021/8/21 22:06
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
#define int long long
using namespace std;
typedef long long lxl;
template<typename T>
inline T  max(T &a, T &b) {
	return a > b ? a : b;
}
template<typename T>
inline T  min(T &a, T &b) {
	return a < b ? a : b;
}

inline char gt() {
	static char buf[1 << 21], *p1 = buf, *p2 = buf;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void  read(T &x) {
	register char ch = gt();
	x = 0;
	register int w(0);
	while(!(ch >= '0' && ch <= '9'))ch = gt();
	while(ch >= '0' && ch <= '9')x = (x << 1) + (x << 3) + (ch & 15), ch = gt();
	w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x) {
	register char ch[20];
	register int num(0);
	while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
	while(num) putchar(ch[num--]);
	putchar('\n');
}
const int N = 5e6 + 79;
int n, m;
int a[N];
lxl sum[N];
lxl day, b, h;

struct SegmentTree {
	int lc[N << 1], rc[N << 1];
	lxl tag[N << 1], ar[N << 1], data[N << 1], add[N << 1];
	int cnt, root;
	inline void build(int &p, int L, int R) {
		if(!p) p = ++cnt;
		tag[p] = -1;
		if(L == R) return;
		int mid(L + R >> 1);
		build(lc[p], L, mid);
		build(rc[p], mid + 1, R);
	}
	inline void pushup(int p) {
		data[p] = data[lc[p]] + data[rc[p]];
		ar[p] = ar[rc[p]];
	}
	inline void change1(int p, int L, int R, lxl val) {
		tag[p] = val;
		data[p] = 1ll * (R - L + 1) * val;
		ar[p] = val;
		add[p] = 0;
	}
	inline void change2(int p, int L, int R, lxl val) {
		add[p] += val;
		data[p] += 1ll * (sum[R] - sum[L - 1]) * val;
		ar[p] += 1ll*a[R] * val;
	}
	inline void pushdown(int p, int L, int R) {
		int mid(L + R >> 1);
		if(tag[p] != -1) {
			change1(lc[p], L, mid, tag[p]);
			change1(rc[p], mid + 1, R, tag[p]);
			tag[p] = -1;
		}
		if(add[p]) {
			change2(lc[p], L, mid, add[p]);
			change2(rc[p], mid + 1, R, add[p]);
			add[p] = 0;
		}
	}
	inline int find(int p, int L, int R, lxl val) {
		if(L == R) {
			return data[p] < val ? n + 1 : L;
		}
		pushdown(p, L, R);
		int mid((L + R >> 1));
		if(ar[lc[p]] >= val) return find(lc[p], L, mid, val);
		else return find(rc[p], mid + 1, R, val);
	}
	
	inline lxl change3(int p, int L, int R, int ll, int rr, lxl val) {
		if(!p) return 0;
		if(ll <= L && rr >= R) {
			lxl tmp = data[p];
			change1(p, L, R, val);
			return tmp - data[p];
		}
		int mid(L + R >> 1);
		lxl ans(0);
		pushdown(p, L, R);
		if(ll <= mid) ans += change3(lc[p], L, mid, ll, rr, val);
		if(rr > mid)  ans += change3(rc[p], mid + 1, R, ll, rr, val);
		pushup(p);
		return ans;
	}
} S;

 main() {
//	freopen("chives.in", "r", stdin);
//	freopen("chives.out", "w", stdout);
	read(n);
	read(m);
	rep(i, 1, n) {
		read(a[i]);
	}
	sort(a + 1, a + n + 1);
	rep(i, 1, n) {
		sum[i] = sum[i - 1] + a[i];
	}
	S.build(S.root, 1, n);
	lxl now = 0;
	while(m--) {
		read(day);
		read(b);
		S.change2(S.root, 1, n, day - now);
		now = day;
		out(S.change3(S.root, 1, n, S.find(S.root, 1, n, b), n, b));
	}
	return 0;
}
2021/8/21 22:06
加载中...