1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N=1e5+10,M=N<<1,mod=1e9+7; struct Edge{int x,y,w;}E[M]; vector<int>G[N<<1]; int n,m,nn,fa[N<<1],dfn[N<<1],path[N<<2],id=0; int val[N<<1],f[N<<2][20],logn[N<<2]; int findfa(int x){return x==fa[x] ? x : fa[x]=findfa(fa[x]);} void ex_kruskal() { nn=n; sort(E+1,E+m+1,[&](Edge e1,Edge e2){return e1.w<e2.w;}); for(int i=1;i<2*n;i++)fa[i]=i; for(int i=1;i<=m;i++) { int tx=findfa(E[i].x),ty=findfa(E[i].y); if(tx!=ty) { ++nn; val[nn]=E[i].w; fa[tx]=fa[ty]=nn; G[nn].emplace_back(tx),G[nn].emplace_back(ty); if(nn==2*n-1)break; } } } void dfs(int x) { dfn[x]=++id; path[id]=x; for(int y:G[x]) dfs(y), path[++id]=x; } int lca(int x,int y) { x=dfn[x],y=dfn[y]; if(x>y)swap(x,y); int k=logn[y-x+1]; x=f[x][k],y=f[y-(1<<k)+1][k]; return dfn[x]<dfn[y] ? x : y; } int A,B,C,P; inline int rnd(){return A=(A*B+C)%P;} signed main() { ios::sync_with_stdio(False);cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=1;i<=m;i++)cin>>E[i].x>>E[i].y>>E[i].w; ex_kruskal(); dfs(nn); logn[1]=0;for(int i=2;i<=4*n;i++)logn[i]=logn[i>>1]+1; for(int i=1;i<=4*n;i++)f[i][0]=path[i]; int D=log2(4*n); for(int j=1;j<=D;j++) for(int i=1;i+(1<<j)-1<=4*n;i++) { int x=f[i][j-1],y=f[i+(1<<(j-1))][j-1]; f[i][j]=dfn[x]<dfn[y] ? x : y; } int q;cin>>q>>A>>B>>C>>P; long long ans=0; while(q--) { int x=rnd()%n+1,y=rnd()%n+1; if(x==y)continue; ans=(ans+val[lca(x,y)])%mod; } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 536
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 75
- 已通过
- 15
- 上传者