답안 #922957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
922957 2024-02-06T11:09:01 Z vjudge1 Meteors (POI11_met) C++17
74 / 100
3070 ms 65536 KB
#include <bits/stdc++.h>
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define sz(x) (int)x.size()
#define F first
#define S second
#define int long long

const int dx[] = {0, 1, 0, -1, -1, 1, 1, -1};
const int dy[] = {1, 0, -1, 0, -1, 1, -1, 1};
const int maxn = 3e5+7;
const int inf = 1e9;
const int mod = 1e9+7;

using namespace std;

int n, m, k;
int s[maxn], need[maxn], ans[maxn];
int ql[maxn], qr[maxn], qx[maxn];
vector<int> cur[maxn], g[maxn];
int t[4 * maxn], p[4 * maxn];

struct node{
	int l, r;
} d[maxn];

void push(int tl, int tr, int v){
	if(tl != tr){
		p[v * 2] += p[v];
		p[v * 2 + 1] += p[v];
	}
	t[v] += p[v];
	p[v] = 0;
}

void build(int tl = 1, int tr = m, int v = 1){
	t[v] = p[v] = 0;
	if(tl == tr) return;
	int md = (tl + tr) / 2;
	build(tl, md, v * 2);
	build(md + 1, tr, v * 2 + 1);
}

void update(int l, int r, int val, int tl = 1, int tr = m, int v = 1){
	push(tl, tr, v);
	if(l > tr || tl > r) return;
	if(l <= tl && tr <= r){
		p[v] += val;
		push(tl, tr, v);
		return;
	}
	int md = (tl + tr) / 2;
	update(l, r, val, tl, md, v * 2);
	update(l, r, val, md + 1, tr, v * 2 + 1);
}

int get(int pos, int tl = 1, int tr = m, int v = 1){
	push(tl, tr, v);
	if(tl == tr){
		return t[v];
	}else{
		int md = (tl + tr) / 2;
		if(pos <= md){
			return get(pos, tl, md, v * 2);
		}else{
			return get(pos, md + 1, tr, v * 2 + 1);
		}
	}
}

void solve(){
	cin >> n >> m;
	for(int i = 1; i <= m; i++){
		cin >> s[i];
		g[s[i]].push_back(i);
	}
	for(int i = 1; i <= n; i++) cin >> need[i];
	cin >> k;
	for(int i = 1; i <= n; i++) d[i] = {1, k};
	for(int i = 1; i <= k; i++) cin >> ql[i] >> qr[i] >> qx[i];
	for(int rep = 1; rep <= 25; rep++){
		for(int i = 1; i <= n; i++){
			int mid = (d[i].l + d[i].r) / 2;
			cur[mid].pb(i);
		}
		build();
		for(int mid = 1; mid <= k; mid++){
			if(ql[mid] <= qr[mid]){
				update(ql[mid], qr[mid], qx[mid]);
			}else{
				update(ql[mid], m, qx[mid]);
				update(1ll, qr[mid], qx[mid]);
			}
			for(auto x : cur[mid]){
				int sum = 0;
				for(auto pos : g[x]){
					sum += get(pos);
				}
				if(sum >= need[x]){
					ans[x] = mid;
					d[x].r = mid - 1;
				}else{
					d[x].l = mid + 1;
				}
			}
		}
		for(int i = 1; i <= k; i++){
			cur[i].clear();
		}
	}
	for(int i = 1; i <= n; i++){
		if(ans[i] == 0) cout << "NIE\n";
		else cout << ans[i] << '\n';
	}
}

signed main(){
	speed
	int test = 1;
//	cin >> test;
	while(test--){
		solve();
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 31068 KB Output is correct
2 Correct 13 ms 31332 KB Output is correct
3 Correct 14 ms 31432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 31340 KB Output is correct
2 Correct 12 ms 31324 KB Output is correct
3 Correct 14 ms 31376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 515 ms 37672 KB Output is correct
2 Correct 581 ms 42924 KB Output is correct
3 Correct 595 ms 42040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 558 ms 39252 KB Output is correct
2 Correct 554 ms 39204 KB Output is correct
3 Correct 592 ms 43192 KB Output is correct
4 Correct 133 ms 40532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 277 ms 38228 KB Output is correct
2 Correct 493 ms 43420 KB Output is correct
3 Correct 252 ms 31916 KB Output is correct
4 Correct 551 ms 42552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 546 ms 36868 KB Output is correct
2 Correct 521 ms 39244 KB Output is correct
3 Correct 514 ms 37520 KB Output is correct
4 Correct 596 ms 44484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2463 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3070 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -