社区讨论

蒟蒻求助,90分,(悬赏一关注

P2597[ZJOI2012] 灾难参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo39dj5f
此快照首次捕获于
2023/10/24 02:56
2 年前
此快照最后确认于
2023/10/24 02:56
2 年前
查看原帖
第5点wa
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 10;

int h[maxn], nh[maxn], rep = 1;
struct edge{ int to, nx; }e[maxn], l[maxn];

void ad(int u, int v){ e[++rep] = {v, h[u]}, h[u] = rep;}
void nad(int u, int v){ l[++rep] = {v, nh[u]}, nh[u] = rep;}
#define te e[i].to

int n;

int ind1[maxn], ind2[maxn];
int dep[maxn];
int st[maxn][22];
queue<int> q;

int lg[maxn];

int lca(int x, int y){
	if(dep[x] != dep[y]){
		if(dep[x] > dep[y]) swap(x,y);
		for (int k = lg[dep[y] - dep[x]]; k >= 0; k--){
			if(dep[ st[y][k] ] < dep[x]) continue;
			y = st[y][k];
		}
	}
	if(x == y) return x;
	for (int k = lg[dep[x]]; k >= 0; k--){
		if(st[x][k] == st[y][k]) continue;
		x = st[x][k], y = st[y][k];
	}
	return st[x][0];
}

int siz[maxn];
void dfs(int x){
	siz[x] = 1;
	for (int i = nh[x]; i; i = l[i].nx){
		dfs(l[i].to);
		siz[x] += siz[l[i].to];
	}
}

signed main(){
	cin >> n;
	
	for (int i = 1; i <= n; i++) lg[i] = lg[i>>1] + 1;
	for (int i = 1; i <= n; i++) lg[i]--;
	
	for (int i = 1, v; i <= n; i++){
		while(1){
			cin >> v;
			if(!v) break;
			ad(v, i);
			ind1[i]++, ind2[i]++;
		}
	}
	
	for (int i = 1; i <= n; i++) if(!ind1[i]) nad(0, i), st[i][0] = 0;
	for (int i = 1; i <= n; i++) if(!ind1[i]) q.push(i);
	dep[0] = 1;
	
	while(!q.empty()){
		int x = q.front();q.pop();
		dep[x] = dep[st[x][0]] + 1;
		nad(st[x][0], x);
		for (int k = 1; k <= lg[dep[x]]; k++) st[x][k] = st[st[x][k-1]][k-1];
		for (int i = h[x];i ; i = e[i].nx){
			ind1[te]--;
			if(ind1[te] == 0) q.push(te);
			if(st[te][0] == 0) st[te][0] = x;
			else{
				st[te][0] = lca(st[te][0], x);
			}
		}
	}
	
	dfs(0);
	
	for (int i = 1; i <= n; i++) cout << siz[i] - 1 << "\n";
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...