답안 #1049961

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1049961 2024-08-09T06:23:40 Z fuad27 식물 비교 (IOI20_plants) C++17
25 / 100
434 ms 41536 KB
#include "plants.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;

struct lazy_segtree {
	vector<pair<int,int>> T;
	vector<int> lz;
	int n;
	void build(vector<int> &a, int tl, int tr, int v) {
		if(tl == tr) {
			T[v] = {a[tl], tl};
			return;
		}
		int tm = (tl+tr)/2;
		build(a, tl, tm, 2*v);
		build(a, tm+1, tr, 2*v+1);
		T[v] = min(T[2*v], T[2*v+1]);

	}
	lazy_segtree(vector<int> &a) {
		n=a.size();	
		T.resize(4*n);
		lz.resize(4*n);
		build(a, 0, n-1, 1);
	}
	void push(int v){
		lz[2*v] += lz[v];
		lz[2*v+1] += lz[v];
		T[2*v].first += lz[v];
		T[2*v+1].first += lz[v];
		lz[v] = 0;
	}
	void update(int l, int r, int add, int tl, int tr, int v) {
		if(r < tl or tr < l)return;
		if(l <= tl and tr<=r) {
			lz[v]+=add;
			T[v].first+=add;
			return;
		}
		push(v);
		int tm=(tl+tr)/2;
		update(l, r, add, tl, tm, 2*v);
		update(l, r, add, tm+1, tr, 2*v+1);
		T[v] = min(T[2*v], T[2*v+1]);
	}
	pair<int,int> query(int l, int r, int tl, int tr, int v) {
		if(r < tl or tr < l)return {1e9, 1e9};
		if(l <= tl and tr<=r)return T[v];
		push(v);
		int tm=(tl+tr)/2;
		return min(query(l, r, tl, tm, 2*v), query(l, r, tm+1, tr, 2*v+1));
	}
	void update(int l, int r, int add) {
		update(l, r, add, 0, n-1, 1);
	}
	pair<int,int> query(int l, int r) {
		return query(l, r, 0, n-1, 1);
	}
};
const int N = 5000+10;
vector<int> H;
vector<int> g[N];
bitset<N> ans[N];
int rt;
void dfs2(int at) {
	if(ans[rt][at])return;
	ans[rt][at] = 1;
	for(int to:g[at]) {
		dfs2(to);
	}
}
void init(int k, std::vector<int> r) {
	int n = r.size();
	lazy_segtree ls(r);
	int cnt = n;
	H.resize(n, -1);
	auto dfs = [&](int at, auto &&dfs) -> void {
		if(at >= k-1) {
			pair<int,int> val = ls.query(at-k+1, at-1);
			while(val.first == 0) {
				dfs(val.second, dfs);
				val = ls.query(at-k+1, at-1);
			}
			H[at] = cnt--;
			ls.update(at-k+1, at-1, -1);
			ls.update(at, at, 1e9);
		}
		else {
			pair<int,int> val = min(ls.query(0, at-1), ls.query(n-k+at+1, n-1));
			while(val.first == 0) {
				dfs(val.second, dfs);
				val = min(ls.query(0, at-1), ls.query(n-k+at+1, n-1));
			}
			H[at] = cnt--;
			ls.update(0, at-1, -1), ls.update(n-k+at+1, n-1, -1);
			ls.update(at, at, 1e9);
		}
	};
	while(ls.query(0, n-1).first == 0) {
		dfs(ls.query(0, n-1).second, dfs);
	}

	for(int i =0 ;i<n;i++) {
		int nxtmn = -1;
		cnt=0;
		for(int j = (i+1)%n;cnt+1<k;j=(j+1)%n, cnt++) {
			if(H[j] < H[i] and (nxtmn == -1 or H[nxtmn] < H[j])) {
				nxtmn = j;
			}
		}
		if(nxtmn != -1)g[i].push_back(nxtmn);
		nxtmn = -1;
		cnt=0;
		for(int j = (i+1)%n;cnt+1<k;j=(j+1)%n, cnt++) {
			if(H[j] > H[i] and (nxtmn == -1 or H[nxtmn] > H[j])) {
				nxtmn = j;
			}
		}
		if(nxtmn != -1)g[nxtmn].push_back(i);
	}
	for(rt = 0;rt<n;rt++) {
		dfs2(rt);
	}
	return;
}

int compare_plants(int x, int y) {
	if(ans[x][y])return 1;
	if(ans[y][x])return -1;
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 44 ms 4184 KB Output is correct
7 Runtime error 34 ms 10576 KB Execution killed with signal 11
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 560 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 14 ms 1372 KB Output is correct
7 Correct 361 ms 8652 KB Output is correct
8 Correct 1 ms 600 KB Output is correct
9 Correct 15 ms 1240 KB Output is correct
10 Correct 354 ms 8788 KB Output is correct
11 Correct 170 ms 8624 KB Output is correct
12 Correct 190 ms 8880 KB Output is correct
13 Correct 434 ms 8628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 560 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 14 ms 1372 KB Output is correct
7 Correct 361 ms 8652 KB Output is correct
8 Correct 1 ms 600 KB Output is correct
9 Correct 15 ms 1240 KB Output is correct
10 Correct 354 ms 8788 KB Output is correct
11 Correct 170 ms 8624 KB Output is correct
12 Correct 190 ms 8880 KB Output is correct
13 Correct 434 ms 8628 KB Output is correct
14 Runtime error 42 ms 10152 KB Execution killed with signal 11
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 60 ms 6484 KB Output is correct
4 Runtime error 157 ms 41536 KB Execution killed with signal 11
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 560 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 6 ms 1704 KB Output is correct
8 Correct 7 ms 1628 KB Output is correct
9 Correct 7 ms 1884 KB Output is correct
10 Correct 7 ms 1624 KB Output is correct
11 Correct 9 ms 1628 KB Output is correct
12 Correct 7 ms 1628 KB Output is correct
13 Correct 8 ms 1672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 5 ms 1116 KB Output is correct
6 Runtime error 173 ms 31808 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 44 ms 4184 KB Output is correct
7 Runtime error 34 ms 10576 KB Execution killed with signal 11
8 Halted 0 ms 0 KB -