bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
传送门:bzoj bzoj
wdnmd为什么加强版不是权限题原题却是啊
3545: [ONTAK2010]Peaks
Time Limit: 10 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。
Input
第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。
Output
对于每组询问,输出一个整数表示答案。
Sample Input
1 2 3 4 5 6 7 8 9 10
1 4 4
2 5 3
9 8 2
7 8 10
7 1 4
6 7 1
6 4 8
2 1 5
10 8 10
3 4 7
3 4 6
1 5 2
1 5 6
1 5 8
8 9 2
Sample Output
1
-1
8
HINT
【数据范围】
N<=10^5, M,Q<=5*10^5,h_i,c,x<=10^9。
果然还是太年轻了居然被这种水平的题吊打。。。
简短思路:
首先来一次kruskal
很明显不在树上的边都用不上
然后这时候就出现了kruskal重构树
随便挂个讲得好的博客
拼出来重构树之后用线段树合并或是主席树都行
以下通用代码(只差一排注释)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=200011,inf=0x7f7f7f7f,M=500011; 6 template<typename TP>inline void read(TP &kk) 7 { 8 TP ret=0,f=1;char ch=getchar(); 9 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 10 while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();} 11 kk=ret*f; 12 } 13 int n,m,Q; 14 struct shino 15 { 16 int x,y,w; 17 bool operator < (const shino &a)const 18 {return w<a.w;} 19 }sl[M]; 20 int snr; 21 #define lson(x) (son[x][0]) 22 #define rson(x) (son[x][1]) 23 struct sgt 24 { 25 int c[N*36],son[N*36][2],cnt; 26 void ins(const int x,int &px,int pl,int pr) 27 { 28 if(!px) px=++cnt; 29 c[px]++; 30 if(pl==pr) return; 31 int mi=pl+pr>>1; 32 if(x<=mi) ins(x,lson(px),pl,mi); 33 else ins(x,rson(px),mi+1,pr); 34 } 35 int merge(const int px,const int py) 36 { 37 if(!px||!py) return px+py; 38 int pz=++cnt; 39 c[pz]=c[px]+c[py]; 40 lson(pz)=merge(lson(px),lson(py)); 41 rson(pz)=merge(rson(px),rson(py)); 42 return pz; 43 } 44 int query(int k,const int px,int pl,int pr) 45 { 46 if(pl==pr) return pl; 47 int mi=pl+pr>>1; 48 if(k<=c[lson(px)]) return query(k,lson(px),pl,mi); 49 else return query(k-c[lson(px)],rson(px),mi+1,pr); 50 } 51 }tr; 52 int rt[N]; 53 int h[N]; 54 int f[N],fa[N][20],val[N],son[N][2]; 55 int find(int x) 56 { 57 if(f[x]!=f[f[x]]) return f[x]=find(f[x]); 58 return f[x]; 59 } 60 void kksk()//k,k(ru)sk(al)... 无端玩梗的rkk是屑 61 { 62 snr=n,val[0]=inf; 63 for(int i=1;i<=m;i++) 64 { 65 int x=find(sl[i].x),y=find(sl[i].y); 66 if(x==y) continue; 67 f[x]=f[y]=fa[x][0]=fa[y][0]=++snr; 68 val[snr]=sl[i].w; 69 son[snr][0]=x,son[snr][1]=y; 70 } 71 } 72 73 int saki[N]; 74 int main() 75 { 76 read(n),read(m),read(Q); 77 for(int i=1;i<=n;i++) 78 read(sl[i].w),sl[i].x=i; 79 sort(sl+1,sl+1+n); 80 for(int i=1;i<=n;i++) 81 { 82 if(sl[i].w!=sl[i-1].w) saki[++snr]=sl[i].w; 83 h[sl[i].x]=snr; 84 } 85 for(int i=1;i<=m;i++) 86 read(sl[i].x),read(sl[i].y),read(sl[i].w); 87 sort(sl+1,sl+1+m); 88 for(int i=1;i<=n*2;i++) f[i]=i; 89 kksk(); 90 for(int i=1;i<=19;i++) 91 for(int x=1;x<=snr;x++) 92 fa[x][i]=fa[fa[x][i-1]][i-1]; 93 for(int i=1;i<=n;i++) tr.ins(h[i],rt[i],1,n); 94 for(int i=n+1;i<=n*2;i++) rt[i]=tr.merge(rt[lson(i)],rt[rson(i)]); 95 int lans=0,xi,vi,ki; 96 while(Q--) 97 { 98 read(xi),read(vi),read(ki); 99 xi^=lans,vi^=lans,ki^=lans;//前后就差个这行 100 for(int i=19;i>=0;i--) 101 { 102 if(val[fa[xi][i]]<=vi) xi=fa[xi][i]; 103 } 104 if(tr.c[rt[xi]]<ki){puts("-1");lans=0;} 105 else printf("%d\n",lans=saki[tr.query(tr.c[rt[xi]]-ki+1,rt[xi],1,n)]); 106 } 107 return 0; 108 }
View Code
转载于:https://www.cnblogs.com/rikurika/p/11332801.html
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版相关推荐
- bzoj3551: [ONTAK2010]Peaks加强版
很明显只有最小生成树里面的点有用 我会一个离线的做法,把询问边长排序,逐步合并树,启发式合并splay 在线怎么做呢? 考虑合并出最小生成树的过程,两点合并是并不是一边连向一边而是建出新点,并将新点连 ...
- bzoj3551 [ONTAK2010]Peaks加强版 kruskal重构树
最大边最小,就是最小生成树,可以考虑用主席树维护father数组,但不能遍历子集查找 然后就只能牺牲一部分空间时间来多存一些东西 多存的就是边值大小顺序,本来以为是用主席树排边值,结果由于此题有2种数 ...
- [MATLAB学习笔记]peaks函数1013(2)
>> Z = peaksZ =1 至 10 列0.0001 0.0001 0.0002 0.0004 0.0007 0.0011 0.0017 0.0025 0.0034 0.00430. ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
- 详解车道线检测算法之传统图像处理
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 / 导读 / 车道线检测算法分为传统图像处理方法和深度学习方法.本文详细介绍用传统图像处理方法来解决车 ...
- MATLAB中GUI设计的基本操作
一.如何打开GUI编辑界面 1:命令行输入guide打开GUI编辑界面 2:通过主页下面的新建功能选中如图即可 3:如何在已经新建过GUI以后还想进入GUI的编辑界面 命令行输入guide+文件名字, ...
- MATLAB求音频信号特征的自定义函数.md
分帧和分窗处理: 对信号x加窗分帧处理 1234567 wlen=50; % 帧长 inc=18; % 帧移 win=hanning(wlen); % 窗函数 fn=floor(((N-wlen)/i ...
- python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统
如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题: 示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush ...
- imagej之Python脚本
原生ImageJ仅支持JS脚本,而ImageJ的衍生版本Fiji支持Python脚本编程,所以这里的ImageJ实际是Fiji. 本文是对这个Tutorial的翻译. Fiji官方的Jython指南在 ...
- matlab eqs,EQS(奔驰eqs什么时候上市)
均布,equally spaced,简称eqs.孔.槽等均匀分布时,不必逐个标注尺寸,在尺寸后注明"eqs"即可. 工程制图时,当组成要素(如大量的孔,槽等)相同且均匀分布时,可不 ...
最新文章
- Scrapy框架模拟Github网站登陆
- Linux查看进程的线程信息
- Css的filter常用濾波器屬性及語句大全
- C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:
- linux下桥接模式设置静态IP实现上网
- 在Log4j2中更好地执行非日志记录器调用
- 管理Jenkins作业配置
- LeetCode(682)——棒球比赛(JavaScript)
- Mac OS X安装 ffmpeg
- Cordova for iOS
- android 高德静态地图api,静态地图-API文档-开发指南-Web服务 API | 高德地图API
- ESXi虚拟机导出为OVF模板
- 微信小程序云开发-微信小程序账号申请及新手环境配置
- 树莓派3B+新麦克风调试
- 2023最新整理,340份各行业求职简历模板,找工作必备!
- css3 实现图片闪过一道光效果 亲测可用
- 2021年11月逆向练习
- EC-PCA: 利润中心段(Segment)维护流程
- 张勋说:棒磨机钢棒直径的配置(热处理调质耐磨钢棒)
- 各厂内推整理 | 第三期