社区讨论

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 条回复,欢迎继续交流。

正在加载回复...