Description

【题目描述】同3545

Input

第一行三个数N,M,Q。

第二行N个数,第i个数为h_i

接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。

接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。

Output

同3545

Sample Input

Sample Output

HINT

【数据范围】同3545

这里附上3545:

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

10 11 4

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

6

1

-1

8

HINT

【数据范围】

N<=10^5, M,Q<=5*105,h_i,c,x<=109。

Solution

kruskal重构树

重构出来后要找一棵子树中权值第 \(k\) 大,用主席树维护就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10,MAXM=500000+10,inf=0x3f3f3f3f;
int n,m,q,e,beg[MAXN<<1],nex[MAXN<<2],to[MAXN<<2],st[MAXN<<1],ed[MAXN<<1],cnt,nt,Jie[20][MAXN<<1],h[MAXN<<1],fa[MAXN<<1],lastans,P[MAXN];
std::vector<int> V;
std::map<int,int> M;
struct node{
int u,v,k;
inline bool operator < (const node &A) const {
return k<A.k;
};
};
node side[MAXM];
#define Mid ((l+r)>>1)
#define lson l,Mid
#define rson Mid+1,r
struct ChairMan_Tree{
int sum[MAXN<<5],lc[MAXN<<5],rc[MAXN<<5],root[MAXN<<1],cnt;
inline void Build(int &rt,int l,int r)
{
sum[rt=++cnt]=0;
if(l==r)return ;
else Build(lc[rt],lson),Build(rc[rt],rson);
}
inline void Update(int &rt,int last,int l,int r,int ps)
{
sum[rt=++cnt]=sum[last]+1;
lc[rt]=lc[last];
rc[rt]=rc[last];
if(l==r)return ;
else
{
if(ps<=Mid)Update(lc[rt],lc[last],lson,ps);
else Update(rc[rt],rc[last],rson,ps);
}
}
inline int Query(int now,int last,int l,int r,int k)
{
if(l==r)return l;
else
{
int t=sum[rc[last]]-sum[rc[now]];
if(k<=t)return Query(rc[now],rc[last],rson,k);
else return Query(lc[now],lc[last],lson,k-t);
}
}
};
ChairMan_Tree T;
#undef Mid
#undef lson
#undef rson
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(!x)putchar(48);
static int sta[45],tp;
for(tp=0;x;x/=10)sta[++tp]=x%10;
for(;tp;putchar(sta[tp--]^48));
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline int found(int x)
{
if(fa[x]!=x)fa[x]=found(fa[x]);
return fa[x];
}
inline void insert(int x,int y)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
}
inline void dfs(int x)
{
st[x]=++nt;
if(x<=n)T.Update(T.root[nt],T.root[nt-1],1,n,h[x]);
else T.root[nt]=T.root[nt-1];
for(register int i=beg[x];i;i=nex[i])
if(to[i]==Jie[0][x])continue;
else dfs(to[i]);
ed[x]=nt;
}
inline void discretization()
{
for(register int i=1;i<=n;++i)V.push_back(h[i]);
std::sort(V.begin(),V.end());
V.erase(std::unique(V.begin(),V.end()),V.end());
for(register int i=0,lt=V.size();i<lt;++i)M[V[i]]=i+1,P[i+1]=V[i];
for(register int i=1;i<=n;++i)h[i]=M[h[i]];
}
inline void init()
{
discretization();
cnt=n;h[0]=inf;
for(register int i=1;i<=n+n-1;++i)fa[i]=i;
std::sort(side+1,side+m+1);
for(register int i=1,u,v;i<=m;++i)
{
u=found(side[i].u),v=found(side[i].v);
if(u==v)continue;
else
{
cnt++;h[cnt]=side[i].k;
insert(cnt,u);insert(u,cnt);
insert(cnt,v);insert(v,cnt);
fa[u]=fa[v]=Jie[0][u]=Jie[0][v]=cnt;
}
}
T.Build(T.root[0],1,n);
for(register int i=1;i<=cnt;++i)
if(!st[i])dfs(found(i));
for(register int j=1;j<=19;++j)
for(register int i=1;i<=cnt;++i)Jie[j][i]=Jie[j-1][Jie[j-1][i]];
}
inline int Get(int v,int x)
{
for(register int i=19;i>=0;--i)
if(h[Jie[i][v]]<=x)v=Jie[i][v];
return v;
}
int main()
{
read(n);read(m);read(q);
for(register int i=1;i<=n;++i)read(h[i]);
for(register int i=1,u,v,k;i<=m;++i)
{
read(u);read(v);read(k);
side[i]=(node){u,v,k};
}
init();
while(q--)
{
int v,x,k;read(v);read(x);read(k);
if(lastans!=-1)v^=lastans,x^=lastans,k^=lastans;
int ps=Get(v,x);
if(ps==v||k>T.sum[T.root[ed[ps]]]-T.sum[T.root[st[ps]-1]])printf("%d\n",lastans=-1);
else write(lastans=P[T.Query(T.root[st[ps]-1],T.root[ed[ps]],1,n,k)],'\n');
}
return 0;
}

【刷题】BZOJ 3551 [ONTAK2010]Peaks加强版的更多相关文章

  1. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  2. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  3. bzoj 3551 [ONTAK2010]Peaks加强版(kruskal,主席树,dfs序)

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  4. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  5. BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增

    建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...

  6. 3551: [ONTAK2010]Peaks加强版

    3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 +  倍增 ...

  7. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

  8. ●BZOJ 3551 [ONTAK2010]Peaks(在线)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3551 题解: 最小生成树 Kruskal,主席树,在线 这个做法挺巧妙的...以Kruska ...

  9. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

随机推荐

  1. php-7.1.11-64位

    php-7.1.11-Win32-VC14-x64.zip 链接:https://pan.baidu.com/s/1w8-fJo8-oWrriHyWpU5Fpg 提取码:bd0e 复制这段内容后打开百 ...

  2. 出现 org.springframework.beans.factory.BeanCreationException 异常的原因及解决方法

    1 异常描述 在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报出如下错误: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 org.springframework.b ...

  3. linux-shell-screen后台调用-后台运行脚本和命令-仿start命令-伪窗口界面

    序 我比较熟练bat.cmd脚本.刚接触使用shell时,总会习惯想用windows窗口界面来套用shell脚本.于是找到screen后台命令,它可以交互shell脚本,保持后台运行.但是在批处理ba ...

  4. RabbitMQ理论部分

    概念 queue        队列 exchange   交换机 bind          绑定 channel     通道 一个发送消息流程包含上述四个概念.消息经过channel传递给exc ...

  5. shell之arp命令

    arp: 显示所有的表项. arp -d address: 删除一个arp表项. arp -s address hw_addr: 设置一个arp表项.   常用参数: -a 使用bsd形式输出.(没有 ...

  6. Python之并发编程-concurrent

    方法介绍 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池 ...

  7. "prefs:root" or "App-Prefs:root"

    iOS 苹果审核也是看心情的吗?已经上线几个版本了,新版本提交审核居然被查出来了! Guideline 2.5.1 - Performance - Software Requirements Your ...

  8. 冲刺One之站立会议4 /2015-5-17

    今天我们继续了昨天未完成的部分,把服务器端的在线人数显示做了出来,但是在调试的时候还有一些不可预知的自己也不会改的bug,让我们有点不知所措,启动时间的显示相对来说比较容易实现. 燃尽图4

  9. 使用Axure RP设计Android界面原型

    转至@徐州瑞步科技(http://www.cnblogs.com/brooks-dotnet/archive/2013/06/05/3119923.html) 资源地址:http://pan.baid ...

  10. 结对作业(1.0版)(bug1已修复)

    import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing ...