bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
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 }
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版的更多相关文章
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- 「BZOJ3545」「ONTAK2010」Peaks
「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版
题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
Description 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...
- BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3551 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...
- BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】
重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...
- BZOJ3551 : [ONTAK2010]Peaks加强版
首先强制在线的话,肯定是不能再离线排序+平衡树启发式合并了. 这回要用的是线段树合并,每次把两棵线段树合并,总复杂度为$O(n\log n)$ 预处理: 把边按权值从小到大排序,依次加边, 对于边(x ...
随机推荐
- Azure AD(六)添加自定义域名
一,引言 每当我们在 Azure Portal 上创建新的租户时,都会在设置租户的 "初始域名" 后加上 ".onmicrosoft.com",默认情况下 &q ...
- linux 运维工程师如何降低工作难度
文章目录 1.Linux "优化" 2.git "优化" 3.mysql "优化" 4.kubernetes "优化" ...
- 详解Spring DI循环依赖实现机制
一个对象引用另一个对象递归注入属性即可实现后续的实例化,同时如果两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环即所谓的循环依赖怎么实现呢属性的互相注入呢? Spring bean生命周期具体 ...
- 关于iOS APP转让
需要以下条件即可
- vue从后台拿数据渲染页面图片
<div class="list-content"> <div v-for="goods in goodsList" class=" ...
- Ubuntu20.04 Focal Cloudimage扩容以及KVM安装的问题记录
运行Ubuntu20.04的KVM虚机遇到一些问题, 单独总结一下 镜像扩容 不能用virt-resize --expand /dev/sda1 old.qcow2 new.qcow2这样的命令, 这 ...
- ftp用的是tcp还是udp_如何通俗地解释TCP和UDP协议和HTTP、FTP、SMTP等协议之间的区别
HTTP协议 老王喜欢看岛国小片,时常泡在论坛上和网友交流最新资讯,老王是通过浏览器浏览网页的,而浏览器是借助HTTP协议与论坛服务器沟通交流. FTP协议 老王购买了该网站的会员,可以无限制下载高清 ...
- 【Windows 操作系统】Windows 进程的内核对象句柄表
总结: 1.句柄就是进程句柄表中的索引.2.句柄是对进程范围内一个内核对象地址的引用,一个进程的句柄传给另一个进程是无效的.一个内核对象可用有多个句柄.Windows之所以要设立句柄,根本上源于内存管 ...
- 缓冲区(buffer)与缓存(cache) 缓冲:缓解冲击,缓存:临时存储
缓存与缓冲区 简要概述 缓存(cache):故名思意就是临时存储一下数据的存储器,其他设备可能等下还用的到数据.缓存区可以用来做缓冲区 缓冲区(Buffer):故名意思就是解决设备之间速度不匹配的问题 ...
- SVG小图片格式显示(字符图标,可设置title属性)
1.HTML + Font 方式: 修改图标颜色只需修改字体颜色,修改图片大小只需修改字体大小. 关于字体图片,我们可以自己制作,也可以从网上下载 阿里巴巴矢量图库. 在线图标字体库.Icomoon. ...