最大边最小,就是最小生成树,可以考虑用主席树维护father数组,但不能遍历子集查找

然后就只能牺牲一部分空间时间来多存一些东西

多存的就是边值大小顺序,本来以为是用主席树排边值,结果由于此题有2种数据(边值、点值)要排,所以每加一个边维护点值排序空间是不对的

然后就按照边重构一棵树,尽量利用以前的结果,由于主席树类似桶排,利于合并,所以就直接指针指过去就可以了

就是在原来并查集合并的基础上,让边可持久化,用边的大小调整选用的集合

这样一个边值的一个块就在一个子树里了

然后就是子树第K大

码:

#include<bits/stdc++.h>
using namespace std;
int fu[500005],f[200005][25],qian[200005],cnt,sz[200005*20],ch[200005*20][2],i,lin[500005],tot,co[200005],a,b,v[500005],m,q,rt[200005],c,lrt[200005],last,ans,n,k,vv,x;
map<int,int>ma;
vector<int>xia[200005];
struct la
{int a,b,v;
}B[500005];
bool cmp(la a,la b)
{return a.v<b.v;
}
int zhao(int o)
{if(fu[o]!=o)fu[o]=zhao(fu[o]);return fu[o];
}
void dfs(int o)
{int i;for(i=1;i<=20;i++)f[o][i]=f[f[o][i-1]][i-1];for(i=0;i<xia[o].size();i++){dfs(xia[o][i]);       }
}
void up(int o)
{sz[o]=sz[ch[o][0]]+sz[ch[o][1]];
}
void jia(int o,int last,int l,int r)
{
if(l==r)
{sz[o]=sz[last]+1;
return ;
}   int mid=(l+r)>>1;if(a<=mid){ch[o][0]=++cnt;ch[o][1]=ch[last][1];jia(ch[o][0],ch[last][0],l,mid);    }if(b>mid){ch[o][0]=ch[last][0];ch[o][1]=++cnt;jia(ch[o][1],ch[last][1],mid+1,r);}up(o);
}
void dfs2(int o)
{
int i;
a=b=ma[v[o]];
rt[o]=++cnt;
qian[o]=last;
jia(rt[o],last,1,n);
last=rt[o];
for(i=0;i<xia[o].size();i++)
{
int nd=xia[o][i];
dfs2(nd);
}
lrt[o]=last;
}
void cha(int o,int last,int l,int r)
{
if(sz[o]-sz[last]<k)return;
if(l==r)
{c=l;return ;}
int mid=(l+r)>>1;
if(sz[ch[o][1]]-sz[ch[last][1]]>=k)cha(ch[o][1],ch[last][1],mid+1,r);
else k-=sz[ch[o][1]]-sz[ch[last][1]],cha(ch[o][0],ch[last][0],l,mid);
}
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int main()
{
//freopen("la.in","r",stdin);scanf("%d%d%d",&n,&m,&q);for(i=1;i<=n*3;i++)fu[i]=i,v[i]=-1;for(i=1;i<=n;i++)v[i]=read(),lin[i]=v[i];for(i=1;i<=m;i++){B[i].a=read();B[i].b=read();B[i].v=read();    }tot=n;lin[n+1]=-1;sort(lin+1,lin+2+n);n++;for(i=1;i<=n;i++)ma[lin[i]]=i;
sort(B+1,B+1+m,cmp);for(i=1;i<=m;i++){int f1=zhao(B[i].a);int f2=zhao(B[i].b);if(f1==f2)continue;++tot;f[f1][0]=tot;f[f2][0]=tot;fu[f1]=tot;fu[f2]=tot;xia[tot].push_back(f1);xia[tot].push_back(f2);co[tot]=B[i].v;       }   dfs(tot);dfs2(tot);lrt[0]=last;while(q--){x=read();vv=read();k=read();if(ans!=-1)x^=ans,vv^=ans,k^=ans;for(i=20;i>=0;i--)if(f[x][i]&&co[f[x][i]]<=vv)x=f[x][i];c=1;  cha(lrt[x],qian[x],1,n);if(c==1){ans=-1; printf("-1\n");}else
{ans=lin[c];printf("%d\n",ans);
}}
}

bzoj3551 [ONTAK2010]Peaks加强版 kruskal重构树相关推荐

  1. bzoj3551: [ONTAK2010]Peaks加强版

    很明显只有最小生成树里面的点有用 我会一个离线的做法,把询问边长排序,逐步合并树,启发式合并splay 在线怎么做呢? 考虑合并出最小生成树的过程,两点合并是并不是一边连向一边而是建出新点,并将新点连 ...

  2. #3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)

    #3551. [ONTAK2010]Peaks加强版 我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么. 考虑按照边权升序,建议kruskalkruskalkrus ...

  3. [ONTAK2010] Peaks加强版 (kruskal重构树+主席树+倍增)

    Peaks description solution code description 在Bytemountains有N座山峰,每座山峰有他的高度h_i 有些山峰之间有双向道路相连,共M条路径,每条路 ...

  4. 【BZOJ3551】Peaks加强版,主席树+kruskal重构+dfs序+倍增思想

    传送门 写在前面:一道调了不止一上午的题目 思路:我们先来看一下神奇的kruskal重构树 图中红色的是原图的边权,黑色的是原图上的点 这样生成的树有一些十分优美的性质: 1.二叉树(好吧这题意义不大 ...

  5. kruskal 重构树(讲解 + 例题)

    kruskal重构树 如何建树 模仿kruskalkruskalkruskal,先将所有边排序. 依次遍历每一条边,如果这条边的两个节点(u,vu, vu,v)不在同一个连通块里面, 则新建一个nod ...

  6. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  7. ONTAK2010 Peaks加强版(离线在线)

    题面 弱化版:luogu 强制在线版:bzoj 题解 本题有两种解法 离线算法:线段树合并 先看一道简单题[USACO18JAN]MooTube 本题就是在此基础上求第\(k\)高的点 首先把询问和路 ...

  8. kruskal重构树练习

    洛谷 P4197 Peaks 题意: 有 nnn 个山峰,每一个山峰高 hih_ihi​ ,有 mmm 条双向带权边将一些山峰连接起来,有 qqq 次询问,每次询问 (v,x,k)(v,x,k)(v, ...

  9. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

最新文章

  1. vmware 12中安装 OpenWRT 及 网络配置
  2. 全自动安装 linux光盘,CentOS 7.1全自动安装光盘制作详解
  3. 工业以太网交换机选机攻略
  4. MyBatis 实践
  5. java-net-php-python-jsp音像店租赁录像计算机毕业设计程序
  6. linux vdi,linux – 调整vdi大小不能正常工作
  7. 用Python制作好玩的小游戏
  8. 文件浏览 视频播放器
  9. HTML.初学.更新
  10. unity3d 挂载脚本_Unity3D 全局脚本
  11. android 局部tab页,安卓TabLayout+ViewPager实现切页
  12. 深度学习框架智能时代的操作系统是什么?
  13. 电影评论情感分析-IMDB数据集 | python 利用朴素贝叶斯、神经网络模型
  14. 五大数据分析软件对比:Python、Excel、R、SPSS、SAS
  15. 财务年终总结怎么写?技巧在这里
  16. 短视频运营课程怎么样
  17. 西工大里的河南烩面的五一故事(数模、作业、课题组、考试)
  18. IOS学习之斯坦福大学IOS开发课程笔记(第二课)
  19. 傅里叶变换的虚数部分
  20. PCL点云处理之Gicp配准(附代码,实验结果)(九十一)

热门文章

  1. MscTeX警告Package fontspec Warning: Font “Songti SC Light“ does not contain requested(fontspec)的解决
  2. markdown、LaTeX输入自定义算符Res
  3. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决
  4. java 资深_Java架构师之路:从Java码农到资深架构师
  5. 类路径是什么意思_甲状腺结节4a类严重吗,是什么意思?怎么治疗需要手术吗?一文解答...
  6. 计算机系应用,近距离看专业 计算机专业应用篇
  7. CentOS8如何修改系统日志的时间戳格式(rsyslog8版本)
  8. 大学计算机专业绩点3.7什么水平,大学绩点3.0什么水平 大学里的绩点有什么用...
  9. vue 方法获取返回值_vue中子组件怎么获取父组件中的方法的返回值
  10. linux vcenter6.5下载,vCenter 6.0更新至6.5