社区讨论
蒟蒻求助,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 条回复,欢迎继续交流。
正在加载回复...