답안 #387332

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
387332 2021-04-08T09:17:36 Z SeDunion 푸드 코트 (JOI21_foodcourt) C++17
0 / 100
701 ms 41040 KB
#include<bits/stdc++.h>
#ifndef LOCAL
#define cerr if(false)cerr
#endif // LOCAL
using namespace std;
using ll = long long;
const int N = 25e4 + 66;

int t[N], l[N], r[N], c[N], A[N], n;

ll k[N], B[N];

pair<ll,ll>f[N << 2];
ll del[N];

const int inf = 1e9;

void delpush(int v, int l, int r) {
	if (f[v] == pair{0ll, 0ll}) return;
	if (r - l == 1) del[l] = max(del[l] - f[v].first, f[v].second);
	else {
		f[v << 1] = {f[v << 1].first + f[v].first, max(f[v << 1].second - f[v].first, 
			f[v].second)};
		f[v<<1|1] = {f[v<<1|1].first + f[v].first, max(f[v<<1|1].second - f[v].first, 
			f[v].second)};
	}
	f[v] = {0ll, 0ll};
}

void delupd(int L, int R, pair<ll,ll> add, int l = 0, int r = n, int v = 1) {
	delpush(v, l, r);
	if (L <= l && r <= R) {
		f[v] = add;
		delpush(v, l, r);
		return;
	}
	if (L >= r || l >= R) {
		return;
	}
	int m = (l + r) >> 1;
	delupd(L, R, add, l, m, v << 1);
	delupd(L, R, add, m, r, v<<1|1);
}

ll delget(int pos, int l = 0, int r = n, int v = 1) {
	delpush(v, l, r);
	if (r - l == 1) return del[l];
	int m = (l + r) >> 1;
	if (pos < m) return delget(pos, l, m, v << 1);
	else return delget(pos, m, r, v<<1|1);
}

ll ans[N];

ll tall[N];
void allupd(int pos, ll v) {
	while (pos < N) { tall[pos] += v, pos |= pos + 1; }
}
ll allget(int pos) { ll r = 0; while (pos >= 0) { r += tall[pos], pos &= pos + 1, --pos; } 
return r;}

ll mx[N << 2], q[N << 2];

const ll INF = 1e18;
vector<int>qs[N];

void push(int v, int l, int r) {
	if (q[v] == 0) return;
	mx[v] += q[v];
	if (r - l > 1) q[v << 1] += q[v], q[v<<1|1] += q[v];
	q[v] = 0;
}

void upd(int L, int R, ll V, int l = 0, int r = n, int v = 1) {
	push(v, l, r);
	if (L <= l && r <= R) {
		q[v] += V;
		push(v, l, r);
		return;
	}
	if (L >= r || l >= R) {
		return;
	}
	int m = (l + r) >> 1;
	upd(L, R, V, l, m, v << 1);
	upd(L, R, V, m, r, v<<1|1);
	mx[v] = max(mx[v << 1], mx[v<<1|1]);
}

int get(int l = 0, int r = n, int v = 1) {
	if (v == 1) push(v, l, r);
	if (mx[v] < 0) return n;
	if (r - l == 1) return l;
	int m = (l + r) >> 1;
	push(v << 1, l, m);
	if (mx[v << 1] >= 0) return get(l, m, v << 1);
	return get(m, r, v<<1|1);
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int m, q;
	cin >> n >> m >> q;
	for (int i = 0 ; i < q ; ++ i) {
		cin >> t[i];
		if (t[i] == 1) {
			cin >> l[i] >> r[i] >> c[i] >> k[i];
			--l[i];
			delupd(l[i], r[i], {-k[i], -inf});
			allupd(l[i], k[i]);
			allupd(r[i], -k[i]);
		} else if (t[i] == 2) {
			cin >> l[i] >> r[i] >> k[i];
			--l[i];
			delupd(l[i], r[i], {k[i], 0});
		} else {
			cin >> A[i] >> B[i];
			--A[i];
			ll all = allget(A[i]);
			ll cur = delget(A[i]);
			ans[i] = 0;
			if (B[i] <= cur) {
				B[i] += all - cur;
				qs[A[i]].emplace_back(i);
			}
		}
	}
	vector<int>inds(n);
	for (int i = 0 ; i < n ; ++ i) {
		if (qs[i].empty()) {
			upd(i, i + 1, -INF);
			continue;
		}
		sort(qs[i].begin(), qs[i].end(), [](int a, int b) {
			return B[a] < B[b];
		});
		upd(i, i + 1, -B[qs[i][0]]);
	}
	for (int i = 0 ; i < q ; ++ i) {
		if (t[i] == 1) {
			upd(l[i], r[i], k[i]);
			while (1) {
				int j = get();
				if (j == n) break;
				ans[qs[j][inds[j]]] = c[i];
				inds[j]++;
				if (inds[j] < (int)qs[j].size()) {
					upd(j, j + 1, -B[qs[j][inds[j]]] + B[qs[j][inds[j] - 1]]);
				} else {
					upd(j, j + 1, -INF);
				}
			}
		}
	}
	for (int i = 0 ; i < q ; ++ i) {
		if (t[i] == 3) {
			cout << ans[i] << "\n";
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 6636 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 6636 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 115 ms 15596 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 701 ms 41040 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 6636 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 140 ms 15852 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 6636 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 6636 KB Output isn't correct
2 Halted 0 ms 0 KB -