[Kruskal重构树][主席树] Luogu P4197 Peaks

给一个 N 个点的无向图,每个点有一个高度,每条边有一个困难度。

多次询问求从 Vi 出发,只经过困难度小于等于 Xi 的边所能到达的点中第 K 高的点。

Kruskal 重构树真是个好东西,既好写又好用。

这道题把树建出来后就变成了求某个点的叶子结点中第 K 大的点。

上面说的某个点就是 V在树中向上跳能跳到的点权 <= Xi 的点,

这个东西显然可以用倍增来求。

因为是求第 K 大,所以还要套一个主席树。

 1 #include<bits/stdc++.h>
 2 #define rep(i,a,b) for(register int i=a;i<=b;++i)
 3 #define rpd(i,a,b) for(register int i=a;i>=b;--i)
 4 #define rep1(i,x) for(register int i=head[x];i;i=nxt[i])
 5 typedef long long ll;
 6 const int N=5e5+5,M=5e5+5;
 7 using namespace std;
 8 inline int read(){
 9     int x=0,f=1;char ch=getchar();
10     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
11     while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
12     return x*f;
13 }
14 struct edge{int x,y,z;}e[M];
15 bool cmp(edge i,edge j){return i.z<j.z;}
16 int n,m,Q,tot,cnt,sum,rt;
17 int H[N],bing[N<<1],head[N<<1],to[N<<1],nxt[N<<1],w[N<<1],h[N],Ls[N],Rs[N];
18 void add(int u,int v){nxt[++tot]=head[u];head[u]=tot;to[tot]=v;}
19 int get(int x){return bing[x]==x?x:bing[x]=get(bing[x]);}
20 void buildkt(){
21     rep(i,1,n<<1)bing[i]=i;
22     sort(e+1,e+m+1,cmp);cnt=n;
23     rep(i,1,m){
24         int x=get(e[i].x),y=get(e[i].y),z=e[i].z;
25         if(x==y)continue;
26         w[++cnt]=z;add(cnt,x);add(cnt,y);
27         bing[x]=bing[y]=cnt;
28         if(cnt==(n<<1)-1)break;
29     }
30 }
31 int f[N][25],hs[N],id[N];
32 void dfs(int x,int fa){
33     f[x][0]=fa;Ls[x]=n+1;Rs[x]=0;
34     if(x<=n){h[++sum]=H[x];Ls[x]=Rs[x]=sum;return;}
35     rep1(i,x){
36         int p=to[i];dfs(p,x);
37         Ls[x]=min(Ls[x],Ls[p]);
38         Rs[x]=max(Rs[x],Rs[p]);
39     }
40 }
41 void init(){rep(j,1,17)rep(i,1,(n<<1)-1)f[i][j]=f[f[i][j-1]][j-1];}
42 int work(int start,int dis){rpd(i,17,0){int k=f[start][i];if(k==0||w[k]>dis)continue;start=k;}return start;}
43 struct Tree{int x,l,r;}t[N<<5];int ban[N];
44 void up(int k){t[k].x=t[t[k].l].x+t[t[k].r].x;}
45 void build(int &k,int l,int r){k=++rt;if(l==r)return;int mid=l+r>>1;build(t[k].l,l,mid);build(t[k].r,mid+1,r);}
46 void change(int k,int &k1,int l,int r,int p){
47     k1=++rt;t[k1]=t[k];if(l==r){t[k1].x+=1;return;}
48     int mid=l+r>>1;
49     if(mid>=p)change(t[k].l,t[k1].l,l,mid,p);
50     else change(t[k].r,t[k1].r,mid+1,r,p);
51     up(k1);
52 }
53 int find(int k,int k1,int l,int r,int p){
54     if(l==r)return hs[l];
55     int mid=l+r>>1,opt=t[t[k1].r].x-t[t[k].r].x;
56     if(opt>=p)return find(t[k].r,t[k1].r,mid+1,r,p);
57     return find(t[k].l,t[k1].l,l,mid,p-opt);
58 }
59 int main(){
60     n=read();m=read();Q=read();
61     rep(i,1,n)H[i]=read();
62     rep(i,1,m)e[i].x=read(),e[i].y=read(),e[i].z=read();
63     buildkt();dfs((n<<1)-1,0);init();
64     rep(i,1,n)hs[i]=h[i];sort(hs+1,hs+n+1);
65     rep(i,1,n)id[i]=lower_bound(hs+1,hs+n+1,h[i])-hs;
66     build(ban[0],1,n);
67     rep(i,1,n)change(ban[i-1],ban[i],1,n,id[i]);
68     //rep(i,1,n)cout<<i<<' '<<h[i]<<endl;
69     while(Q--){
70         int v=read(),x=read(),k=read(),root=work(v,x),L=Ls[root],R=Rs[root];
71         //cout<<L<<' '<<R<<endl;
72         if(k>R-L+1){puts("-1");continue;}
73         printf("%d\n",find(ban[L-1],ban[R],1,n,k));
74     }
75     //system("pause");
76     return 0;
77 }
View Code

转载于:https://www.cnblogs.com/maximumhanyu/p/11427597.html

python023基于Python旅游景点推荐系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
JSP基于SSM网上医院预约挂号系统毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值