社区讨论

造福后人,提供对拍数据生成器

P2633Count on a tree参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@ly766rcp
此快照首次捕获于
2024/07/04 19:15
2 年前
此快照最后确认于
2024/07/04 21:22
2 年前
查看原帖
最低C++版本要求:C++17
CPP
#include <bits/stdc++.h>
// using std::endl;
#define endl "\n"

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int N=10, M=5, Q=5;
constexpr int MAXN=20; // 权值范围

int main()
{
	std::cin.tie(nullptr)->sync_with_stdio(false);	
	int n=N, m=M;
	std::cout<<n<<" "<<m<<endl;
	for(int i=1;i<=n;++i) std::cout<<rng()%MAXN<<" ";
	std::cout<<endl;
	
	std::vector<int>S(n+1);
	auto findSet=[&](auto self,int x)->int{ return x==S[x]? x:S[x]=self(self,S[x]); };
	std::iota(S.begin(),S.end(),0);
	std::vector<std::vector<int>>adj(n+1);
	std::vector<std::pair<int,int>>tt;
	while(tt.size()<n-1){
		int u=rng()%n+1, v=rng()%n+1;
		if(findSet(findSet,u)==findSet(findSet,v)) continue;
		tt.emplace_back(u,v);
		adj[u].emplace_back(v); adj[v].emplace_back(u);
		S[S[u]]=S[v];
	}
	for(auto &[u,v]:tt) std::cout<<u<<" "<<v<<endl;
	
	std::vector<int>dep(n+1);
	std::vector<std::vector<int>>fa(n+1,std::vector<int>(20));
	auto dfs0=[&](auto self,int u,int p)->void{
		dep[u]=dep[fa[u][0]=p]+1;
		for(int i=1;(1U<<i)<=dep[u];++i) fa[u][i]=fa[fa[u][i-1]][i-1];
		for(auto &v:adj[u]) if(v!=p) self(self,v,u);
	};
	dfs0(dfs0,1,0);

    auto LCA=[&](int u,int v)->int{
        if(dep[u]<dep[v]) std::swap(u,v);
        for(int i=19;~i;--i) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
        if(u==v) return u;
        for(int i=19;~i;--i) if(fa[u][i]!=fa[v][i]) u=fa[u][i], v=fa[v][i];
        return fa[u][0];
    };
	
	while(m--){
		int u=rng()%n+1, v=rng()%n+1;
		int lca=LCA(u,v);
		int len=dep[u]+dep[v]-dep[lca]*2+1;
		std::cout<<u<<" "<<v<<" "<<(rng()%len+1)<<endl;
	}	
	return 0;
}

回复

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

正在加载回复...