南宁网站如何制作,网站板块的策划方案,中文响应式网站,做好网站维护正题
题目链接:https://www.luogu.com.cn/problem/P4197 题目大意 nnn个点的一张无向图#xff0c;每个点有一个hih_ihi#xff0c;边有权值。 qqq次询问从vvv出发不走权值超过xxx的路径能到达的第kkk大hih_ihi是多少。 解题思路
构一颗KruskalKruskalKruskal重构树之后…正题
题目链接:https://www.luogu.com.cn/problem/P4197 题目大意
nnn个点的一张无向图每个点有一个hih_ihi边有权值。
qqq次询问从vvv出发不走权值超过xxx的路径能到达的第kkk大hih_ihi是多少。 解题思路
构一颗KruskalKruskalKruskal重构树之后就变成了求子树中第kkk大的值是多少了用KruskalKruskalKruskal重构树上的dfsdfsdfs序建立一棵主席树就好了。
时间复杂度O(nlogn)O(n\log n)O(nlogn) codecodecode
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N5e510,T20;
struct Seq_Tree{int cnt,val[N3],ls[N3],rs[N3];int Change(int x,int l,int r,int pos){int nowcnt;val[now]val[x]1;if(lr)return now;int mid(lr)1;if(posmid)ls[now]Change(ls[x],l,mid,pos),rs[now]rs[x];else rs[now]Change(rs[x],mid1,r,pos),ls[now]ls[x];return now;}int Ask(int x,int y,int l,int r,int k){if(lr)return l;int mid(lr)1,wval[rs[y]]-val[rs[x]];if(kw)return Ask(rs[x],rs[y],mid1,r,k);return Ask(ls[x],ls[y],l,mid,k-w);}
}Tr;
struct node{int x,y,w;
}e[N];
struct edge_node{int to,next;
}a[N*2];
int n,m,q,tot,cnt,h[N],b[N],ls[N],fa[N],val[N];
int rt[N],dfn[N],rfn[N],ed[N],f[N][T1];
void addl(int x,int y){a[tot].toy;a[tot].nextls[x];ls[x]tot;return;
}
bool cmp(node x,node y)
{return x.wy.w;}
int find(int x)
{return (fa[x]x)?(x):(fa[x]find(fa[x]));}
void dfs(int x,int fa){dfn[cnt]x;rfn[x]cnt;for(int ils[x];i;ia[i].next){int ya[i].to;f[y][0]x;dfs(y,x);}ed[x]cnt;return;
}
int ck(int x,int w){for(int iT;i0;i--)if(val[f[x][i]]w)xf[x][i];return x;
}
int main()
{scanf(%d%d%d,n,m,q);for(int i1;in;i)scanf(%d,h[i]),b[i]h[i];sort(b1,b1n);int numunique(b1,b1n)-b-1;for(int i1;in;i)h[i]lower_bound(b1,b1num,h[i])-b;for(int i1;im;i)scanf(%d%d%d,e[i].x,e[i].y,e[i].w);for(int i1;inm;i)fa[i]i;sort(e1,e1m,cmp);cntn;for(int i1;im;i){int Fafind(e[i].x),Fbfind(e[i].y);if(FaFb)continue;val[cnt]e[i].w;addl(cnt,Fa);addl(cnt,Fb);fa[Fa]fa[Fb]fa[cnt];}cnt0;val[0]2147483647;b[0]-1;for(int i1;in;i)if(!rfn[find(i)])dfs(find(i),0);for(int i1;icnt;i)rt[i]Tr.Change(rt[i-1],0,num,h[dfn[i]]);for(int j1;jT;j)for(int i1;icnt;i)f[i][j]f[f[i][j-1]][j-1];while(q--){int x,w,k;scanf(%d%d%d,x,w,k);xck(x,w);printf(%d\n,b[Tr.Ask(rt[rfn[x]-1],rt[ed[x]],0,num,k)]);}return 0;
}