【BZOJ3545】 [ONTAK2010]Peaks
BZOJ3545 [ONTAK2010]Peaks
Solution
既然会加强版,直接把强制在线的操作去掉就好了.
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
int two[20];
int n,m,Q,cnt,top,tot,nodes,lastans;
int H[100005],h[100005];
int f[200005],val[200005],st[200005],ed[200005];
int q[300005],rt[300005];
int ls[5000005],rs[5000005],sum[5000005];
int dep[200005],fa[200005][17],mx[200005][17];
bool vis[200005];
struct node{int u,v,w;}e[500005];
int to[200005],nxt[200005],front[200005];
bool operator<(node a,node b){
return a.w<b.w;
}
inline void Add(int u,int v){
to[++cnt]=v;nxt[cnt]=front[u];front[u]=cnt;
}
inline int find(int x){
if(f[x]!=x)f[x]=find(f[x]);
return f[x];
}
inline int Find(int x,int val){
for(int i=17;~i;i--)
if(dep[x]>=two[i] && mx[x][i]<=val)x=fa[x][i];
return x;
}
inline void insert(int l,int r,int &x,int f,int val){
x=++tot;
sum[x]=sum[f]+1;
if(l==r)return;
ls[x]=ls[f];rs[x]=rs[f];
int mid=(l+r)>>1;
if(val<=mid)insert(l,mid,ls[x],ls[f],val);
else insert(mid+1,r,rs[x],rs[f],val);
}
inline int query(int l,int r,int x,int y,int rank){
if(l==r)return l;
int mid=(l+r)>>1;
if(sum[ls[y]]-sum[ls[x]]>=rank)return query(l,mid,ls[x],ls[y],rank);
else return query(mid+1,r,rs[x],rs[y],rank-sum[ls[y]]+sum[ls[x]]);
}
inline void dfs(int u){
vis[u]=1;q[++top]=u;
for(int i=1;i<=16;i++)
if(dep[u]>=two[i]){
fa[u][i]=fa[fa[u][i-1]][i-1];
mx[u][i]=max(mx[u][i-1],mx[fa[u][i-1]][i-1]);
}
else break;
for(int i=front[u];i;i=nxt[i]){
int v=to[i];
dep[v]=dep[u]+1;
mx[v][0]=val[u];
fa[v][0]=u;
dfs(v);
}
if(u>n)q[++top]=u;
}
inline void solve(){
for(re int i=1;i<=Q;i++){
re int v=gi(),x=gi(),k=gi();
// if(lastans!=-1)v^=lastans,x^=lastans,k^=lastans;
re int t=Find(v,x);
re int a=rt[st[t]],b=rt[ed[t]];
if(sum[b]-sum[a]<k)lastans=-1;
else lastans=H[query(1,n,a,b,sum[b]-sum[a]-k+1)];
printf("%d\n",lastans);
}
}
int main()
{
two[0]=1;
for(re int i=1;i<20;i++)two[i]=two[i-1]<<1;
n=gi();m=gi();Q=gi();
for(re int i=1;i<=n;i++)h[i]=gi(),H[i]=h[i];
sort(H+1,H+n+1);
for(re int i=1;i<=n;i++)h[i]=lower_bound(H+1,H+n+1,h[i])-H;
for(re int i=1;i<=n+n;i++)f[i]=i;
for(re int i=1;i<=m;i++)
e[i].u=gi(),e[i].v=gi(),e[i].w=gi();
sort(e+1,e+m+1);
nodes=n;
for(re int i=1;i<=m;i++){
re int u=find(e[i].u),v=find(e[i].v);
if(u!=v){
nodes++;
f[u]=f[v]=nodes;
val[nodes]=e[i].w;
Add(nodes,u);Add(nodes,v);
if(nodes==2*n-1)break;
}
}
for(re int i=1;i<=n;i++)
if(!vis[i])dfs(find(i));
for(re int i=1;i<=top;i++){
re int t=q[i];
if(t<=n)insert(1,n,rt[i],rt[i-1],h[t]);
else{
rt[i]=rt[i-1];
if(!st[t])st[t]=i;
else ed[t]=i;
}
}
solve();
return 0;
}
【BZOJ3545】 [ONTAK2010]Peaks的更多相关文章
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- 【BZOJ3551】 [ONTAK2010]Peaks加强版
BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...
- bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...
- 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组
[BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...
- 【BZOJ3544】[ONTAK2010]Creative Accounting 前缀和+set
[BZOJ3544][ONTAK2010]Creative Accounting Description 给定一个长度为N的数组a和M,求一个区间[l,r],使得(\sum_{i=l}^{r}{a_i ...
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
Description 在\(Bytemountains\)有\(~n~\)座山峰,每座山峰有他的高度\(~h_i~\). 有些山峰之间有双向道路相连,共\(~m~\)条路径,每条路径有一个困难值 ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- 【bzoj3545】peaks
离线一下,动态开点+线段树合并,然后权值线段树上询问kth即可. #include<bits/stdc++.h> ; *; using namespace std; ; inline in ...
随机推荐
- iOS中堆和栈的区别
管理方式: 对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作有程序员控制,容易产生memory Leak. 申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块 ...
- NOIP2017普及组T1题解
神奇的链接 上面时题目. 其实不得不说,这一题很水,比2015年的第一题水多了. 直接按题目套公式就行了,当然你也可以像我一样化简一下. 直接看代码: #include<cstdio> # ...
- 车站(NOIP1998)
题目链接:车站 这一题,首先你要会推导,推到出式子后,就会像我一样简单AC. 给一张图: 这里,t是第二个车站上车人数. 有什么规律? 其实很好找.有如下规律: 第x车站的人数增量为第x-2车站的上车 ...
- spring boot 实现mybatis拦截器
spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...
- mysql 5.7 修改密码
mysql 5.7 ,user表就没有password 这个字段了. ') where user='root' and host='localhost'; 这样当然就改不了密码了. ') where ...
- 2019.01.02 poj1322 Chocolate(生成函数+二项式定理)
传送门 生成函数好题. 题意简述:一个袋子里有ccc种不同颜色的球,现要操作nnn次,每次等概率地从袋中拿出一个球放在桌上,如果桌上有两个相同的球就立刻消去,问最后桌上剩下mmm个球的概率. 第一眼反 ...
- 用react脚手架新建项目
1.全局安装 create-react-app脚手架 [可能需要管理员权限]npm install -g create-react-app 2.创建项目 create-react-app projec ...
- iconfont阿里巴巴矢量图标库批量保存
F12输入——var iconList = document.querySelectorAll('.icon-gouwuche1');for (var i = 0; i < iconList.l ...
- java学习路线图(2018年最新版)
最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从 ...
- 解决普通用户sudo时出现/usr/bin/sudo must be owned by uid 0 and have the setuid bit set
一:因为之前误操作使用sudo chmod -R 777 /usr命令修改了usr文件的所有者导致了此问题: 二:网上说需要进入recovery mode,经过自己的测试是不需要的: 三:步骤(只需登 ...