답안 #942519

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
942519 2024-03-10T19:31:10 Z Clan328 Meteors (POI11_met) C++17
74 / 100
4622 ms 65536 KB
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define nL '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;

const ll MOD = 1e9 + 7;

void settings()__attribute__((constructor));

// void eval(bool condition) { cout << (condition ? "yes" : "no") << nL; }
// void Eval(bool condition) { cout << (condition ? "Yes" : "No") << nL; }
// void EVAL(bool condition) { cout << (condition ? "YES" : "NO") << nL; }

int ipow(int a, int n) {
   if (n == 0) return 1;
   int x = ipow(a, n/2);
   if (n % 2 == 0) return x*x;
   return x*x*a;
}

template <typename T>
ostream& operator<<(ostream& stream, const vector<T>& v) {
	for (auto elem : v) 
		stream << elem << " ";
	return stream;
}

template <typename T>
istream& operator>>(istream& stream, vector<T>& v){
   for(auto &elem : v)
		stream >> elem;
   return stream;
}

void settings() {
	#ifdef LOCAL
		freopen("io/input.txt", "r", stdin);
		freopen("io/output.txt", "w", stdout);
	#endif

	ios::sync_with_stdio(0);
	cin.tie(0);
}

struct Rain {
	int l, r;
	ll a;
};

int LOG = 20;

struct SegmentTree {
	vl t, lazy;

	SegmentTree(int n) {
		t = vl(2*n);
		lazy = vl(2*n);
	}

	void push(int v, int tl, int tm) {
		t[v+1] += lazy[v];
		t[v+2*(tm-tl+1)] += lazy[v];
		lazy[v+1] += lazy[v];
		lazy[v+2*(tm-tl+1)] += lazy[v];
		lazy[v] = 0;
	}

	void update(int v, int tl, int tr, int l, int r, int x) {
		if (l > r) return;
		if (l == tl && r == tr) {
			t[v] += x;
			lazy[v] += x;
			return;
		}

		int tm = (tl+tr)/2;
		push(v, tl, tm);

		update(v+1, tl, tm, l, min(r, tm), x);
		update(v+2*(tm-tl+1), tm+1, tr, max(tm+1, l), r, x);
		t[v] = max(t[v+1], t[v+2*(tm-tl+1)]);
	}

	ll get(int v, int tl, int tr, int l, int r) {
		if (l > r) return 0;
		if (l == tl && r == tr) return t[v];

		int tm = (tl+tr)/2;
		push(v, tl, tm);

		return max(get(v+1, tl, tm, l, min(r, tm)), get(v+2*(tm-tl+1), tm+1, tr, max(tm+1, l), r));
	}
};

signed main() {
	int n, m;
	cin >> n >> m;
	vi o(m);
	cin >> o;
	for (int i = 0; i < m; i++) o[i]--;

	vl p(n);
	cin >> p;
	int k;
	cin >> k;
	vector<Rain> lr(k);
	for (int i = 0; i < k; i++) {
		cin >> lr[i].l >> lr[i].r >> lr[i].a;
		lr[i].l--; lr[i].r--;
	}

	vvi c(n);
	for (int i = 0; i < m; i++) {
		c[o[i]].pb(i);
	}

	// map<pair<int, pii>, vi> b;
	vector<vector<pair<int, pii>>> b(k);
	for (int i = 0; i < n; i++) b[(k-1)/2].pb({i, {0, k-1}});

	vl res(n, -1);
	SegmentTree tree(m);
	while (LOG--) {
		tree.t = vl(2*m);
		tree.lazy = vl(2*m);
		int nxt = 0;
		vector<vector<pair<int, pii>>> tmp(k);
		for (int mid = 0; mid < k; mid++) {
			for (int i = nxt; i <= mid; i++) {
				if (lr[i].l <= lr[i].r) tree.update(1, 0, m-1, lr[i].l, lr[i].r, lr[i].a);
				else {
					tree.update(1, 0, m-1, lr[i].l, m-1, lr[i].a);
					tree.update(1, 0, m-1, 0, lr[i].r, lr[i].a);
				}
				nxt++;
			}
			for (auto key : b[mid]) {
				int l = key.second.first, r = key.second.second;
				int u = key.first;
				ll sum = 0;
				for (auto v : c[u]) {
					sum += tree.get(1, 0, m-1, v, v);
				}
				// // cout << u << " " << l << " " <<r<< nL;
				if (sum < p[u]) {
					if (mid+1 <= r) tmp[(mid+1+r)/2].pb({u, {mid+1, r}});
				} else {
					if (l <= mid-1)
						tmp[(l+mid-1)/2].pb({u, {l, mid-1}});
					res[u] = mid+1;
				}
			}
		}

		b = tmp;
		tmp.clear();
	}

	for (int i = 0; i < n; i++) {
		if (res[i] != -1) cout << res[i] << nL;
		else cout << "NIE" << nL;
	}

	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 600 KB Output is correct
2 Correct 6 ms 600 KB Output is correct
3 Correct 6 ms 640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 600 KB Output is correct
2 Correct 6 ms 636 KB Output is correct
3 Correct 6 ms 756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 469 ms 8040 KB Output is correct
2 Correct 549 ms 14172 KB Output is correct
3 Correct 536 ms 10468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 519 ms 9584 KB Output is correct
2 Correct 521 ms 9668 KB Output is correct
3 Correct 584 ms 12940 KB Output is correct
4 Correct 117 ms 6900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 296 ms 8244 KB Output is correct
2 Correct 420 ms 13968 KB Output is correct
3 Correct 208 ms 4796 KB Output is correct
4 Correct 510 ms 11296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 507 ms 7220 KB Output is correct
2 Correct 513 ms 9372 KB Output is correct
3 Correct 470 ms 7308 KB Output is correct
4 Correct 539 ms 13416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4477 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4622 ms 65536 KB Output is correct
2 Incorrect 1982 ms 40540 KB Output isn't correct
3 Halted 0 ms 0 KB -