답안 #765851

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
765851 2023-06-25T06:30:36 Z vjudge1 Tree Rotations (POI11_rot) C++17
0 / 100
1000 ms 35660 KB
#include <bits/stdc++.h>
 
#define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
#define all(a) a.begin() , a.end()
#define F first
#define S second
#define int ll 
 
using namespace std;
using ll = long long;
 
const int N = 4e5+5 , inf = 2e9 + 7;
const ll INF = 1e18 ,   mod = 1e9+7;	

int a[N] , ans[N] , n , mxson[N] , cnt[N] , cnt1[N], sz[N] , len; 
vector<int> g[N] , vec[N];
void precalc(int v , int pr){
	if(v <= n) sz[v] = 1;
	for(int to : g[v]){
		if(to != pr){
			precalc(to,v);
			sz[v] += sz[to];
			if(sz[to] > sz[mxson[v]]) mxson[v] = to;
		}
	}
}
int calc(int v){
	int res = 0;
	for(int i = v+1; i <= n;){
		if(i/len == v/len) {
			res += cnt[i];
			i++;
		} else{
			res += cnt1[i/len];
			i += len;
		}
	}
	return res;
}

void dfs(int v , int pr){
	for(int to : g[v]){
		if(to != pr && to != mxson[v]){
			dfs(to,v);
			for(int x : vec[to]) {
				cnt[x] = 0;
				cnt1[x/len]--;
			}
		}
	}
	if(mxson[v]) {
		dfs(mxson[v],v);
		vec[v] = vec[mxson[v]];
		ans[v] += ans[mxson[v]];
	}
	int res = 0 , res1 = 0;
	for(int to : g[v]){
		int ob = calc(-1);
		if(to != pr && to != mxson[v]) {
			for(int x : vec[to]) {
				int num = calc(x);
				res += num;
				res1 += ob-num;
			}
			for(int x : vec[to]) {
				cnt[x] = 1;
				cnt1[x/len]++;
				vec[v].push_back(x);
			}
			ans[v] += ans[to];
		}
	}
	if(v <= n) {
		vec[v].push_back(v);
		cnt[v] = 1;
		cnt1[v/len]++;
	}
	else {
		ans[v] += min(res,res1);
	}
} 
void go(int num){
	int x;
	cin >> x;
	if(x == 0){
		g[num].push_back(num+1);
		g[num+1].push_back(num);
		go(num+1);
	} else {
		g[num].push_back(x);
		g[x].push_back(num);
	}
	cin >> x;
	if(x == 0){
		g[num].push_back(num+1);
		g[num+1].push_back(num);
		go(num+1);
	} else {
		g[num].push_back(x);
		g[x].push_back(num);
	}
}
void solve(){
	cin >> n;
	int a;
	cin >> a;
	go(n+1);
	precalc(n+1,0);
	len = 630;
	dfs(n+1,0);
	cout << ans[n+1] << "\n";
}
/*

*/
signed main(){
	ios;
	solve();
	return 0;
} 
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 19028 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1070 ms 19028 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1073 ms 19176 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1066 ms 19668 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1083 ms 21076 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1057 ms 22476 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1085 ms 33740 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1085 ms 28148 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1077 ms 34732 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1088 ms 35660 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1086 ms 34788 KB Time limit exceeded
2 Halted 0 ms 0 KB -