社区讨论
20pts错误做法,求hack
P13680 [IAMOI R2] 未送出的花参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjhxt2v
- 此快照首次捕获于
- 2025/11/04 02:51 4 个月前
- 此快照最后确认于
- 2025/11/04 02:51 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int T,n;
vector<int> e[11451];
//建边
void build(int u,int v){
e[u].emplace_back(v);
e[v].emplace_back(u);
}
int f[11451][20],dep[11451];
//类似LCA的dfs
void dfs(int x,int fa){
dep[x] = dep[fa]+1;
f[x][0] = fa;
for(int i = 1;(1<<i) <=dep[x];i++){
f[x][i] = f[f[x][i-1]][i-1];
}
for(int i = 0;i<e[x].size();i++){
if(e[x][i] == fa)continue;
dfs(e[x][i],x);
}
return ;
}
int val[11451];
//询问x的第k个祖先
int qfather(int x,int k){
for(int i = 19;i>=0;i--){
if(k < (1<<i)) continue;
x = f[x][i];
k -= (1<<i);
}
return x;
}
struct node{
int id,val;
node(int a,int b){
id = a,val = b;
}
bool operator<(const node & ot) const{
return val < ot.val;
}
};
int bt[11451];
bool vis[11451];
void bfs(){
priority_queue<node> q;
q.push(node(1,val[1]));
vis[1] = 1;
int frt,cur = n;
while(!q.empty()){
frt = q.top().id;
bt[frt] = cur;
cur--;
q.pop();
for(int i = 0;i<e[frt].size();i++){
if(vis[e[frt][i]])continue;
q.push(node(e[frt][i],val[e[frt][i]]));
vis[e[frt][i]] = 1;
}
}
return ;
}
void out(){
priority_queue<int> q;
for(int i = 1;i<=n;i++){
q.push(bt[qfather(i,dep[i]-(dep[i]/2))]);
}
while(!q.empty()){
cout<<q.top()<<' ';
q.pop();
}
cout<<'\n';
return ;
}
signed main(){
cin>>T;
while(T--){
cin>>n;
for(int i = 1;i<=n;i++){
e[i].clear();
}
memset(f,0,sizeof(f));
memset(dep,0,sizeof(dep));
memset(val,0,sizeof(val));
memset(bt,0,sizeof(bt));
memset(vis,0,sizeof(vis));
int U,V;
for(int i = 1;i<n;i++){
cin>>U>>V;
build(U,V);
}
dep[0] = -1;
dfs(1,0);
val[1]++;
for(int i = 2;i<=n;i++){
val[qfather(i,dep[i]-(dep[i]/2))]++;
}
// for(int i = 1;i<=n;i++){
// cout<<dep[i]<<' '<<val[i]<<'\n';
// }
// cout<<'\n';
bfs();
out();
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...