社区讨论
造福后人,提供对拍数据生成器
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 条回复,欢迎继续交流。
正在加载回复...