给一个图,每个点有点权,$q$ 次询问从 $x$ 开始只走点权小于等于 $y$ 的路径能到的点中第 $k$ 大的点权,无解输出 -1

强制在线

请注意因为这个 sb 博主为了描述方便,这里的题目描述用的字母跟原题有出入,题解跟跟这里的题目描述一样,不一定跟 bzoj 上一样(

$n \leq 10^5$

$m,q \leq 5 \times 10^5$

点权$\leq 10^9$

sol:

Kruskal 重构树,每次能走的是一个子树

于是我们可以先倍增找到能走的最高的点(倍增找到重构树上点权小于等于 $y$ 的最高的点)

之后就变成了“一个子树里第 $k$ 小的点权是多少”

我们把 dfs 序处理出来,就是一个区间第 $k$ 小

注意重构树上的 dfs 序要特殊处理一下

#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = 2e5 + ;
int n,m,q,lastans,ToT,nd;
int first[maxn],to[maxn << ],nx[maxn << ],val[maxn],cnt;
inline void add(int u,int v)
{
to[++cnt] = v;
nx[cnt] = first[u];
first[u] = cnt;
to[++cnt] = u;
nx[cnt] = first[v];
first[v] = cnt;
}
struct EDG{int u,v,w;bool operator < (const EDG &b)const{return w < b.w;}}es[maxn * ];
int tp;
int h[maxn],rnk[maxn];
int ufs[maxn];
inline int find(int x){return x == ufs[x] ? x : ufs[x] = find(ufs[x]);}
int mn[maxn],mx[maxn],dfn,fa[maxn][],reh[maxn];
void dfs(int x)
{
//cout<<x<<" ";
if(x <= n) mn[x] = mx[x] = ++dfn,reh[dfn] = x;
else mn[x] = n + ;
for(int i=;i<=;i++)fa[x][i] = fa[fa[x][i - ]][i - ];
for(int i=first[x];i;i=nx[i])
{
if(to[i] == fa[x][])continue;
fa[to[i]][] = x;
dfs(to[i]);
mn[x] = min(mn[x],mn[to[i]]);
mx[x] = max(mx[x],mx[to[i]]);
}
}
inline int get_val(int x,int w)
{
for(int i=;~i;i--)
if(fa[x][i] && h[fa[x][i]] <= w)x = fa[x][i];
return x;
}
int root[maxn],ls[maxn * ],rs[maxn * ],sum[maxn * ],TaT;
inline void Insert(int &now,int pre,int l,int r,int pos)
{
now = ++TaT;
ls[now] = ls[pre];rs[now] = rs[pre];
sum[now] = sum[pre] + ;
if(l == r) return;
int mid = (l + r) >> ;
if(pos <= mid)Insert(ls[now],ls[pre],l,mid,pos);
else Insert(rs[now],rs[pre],mid + ,r,pos);
}
inline int query(int now,int pre,int l,int r,int k)
{
//cout<<now<<" "<<pre<<" "<<l<<" "<<r<<" "<<" "<<k<<endl;
if(sum[now] - sum[pre] < k)return -;
if(l == r) return l;
int mid = (l + r) >> ;
if(sum[rs[now]] - sum[rs[pre]] >= k)return query(rs[now],rs[pre],mid + ,r,k);
else return query(ls[now],ls[pre],l,mid,k - sum[rs[now]] + sum[rs[pre]]);
}
int main()
{
//freopen("szc10e.in","r",stdin);
//freopen("fc.out","w",stdout);
n = read(),m = read(),q = read();
for(int i=;i<=n;i++)rnk[i] = h[i] = read();
for(int i=;i<=n + n;i++)ufs[i] = i;
sort(rnk + ,rnk + n + );
ToT = unique(rnk + ,rnk + n + ) - rnk - ;
for(int i=;i<=n;i++)h[i] = lower_bound(rnk + ,rnk + ToT + ,h[i]) - rnk;
for(int i=;i<=m;i++)
{
int u = read(),v = read(),w = read();es[i] = (EDG){u,v,w};
}nd = n;/*system("cls");*/sort(es + ,es + m + );
int fu,fv;
for(int i=;i<=m;i++)
{
fu = find(es[i].u),fv = find(es[i].v);
if(fu == fv)continue;
++nd;h[nd] = es[i].w;
add(nd,fu);add(nd,fv);
ufs[fu] = ufs[fv] = nd;
}
//system("pause");
dfs(nd);
for(int i=;i<=n;i++)
{
Insert(root[i],root[i - ],,n,h[reh[i]]);
}
int v,x,k,rt;
while(q--)
{
v = read(),x = read(),k = read();
if(lastans != -)v ^= lastans,x ^= lastans,k ^= lastans;
rt = get_val(v,x);
lastans = query(root[mx[rt]],root[mn[rt] - ],,n,k);
if(lastans != -)lastans = rnk[lastans];
printf("%d\n",lastans);
// lastans = 0;
}
}

ONTAK2010 Peaks加强版的更多相关文章

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

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

  2. 【BZOJ3551】 [ONTAK2010]Peaks加强版

    BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...

  3. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  4. 3551: [ONTAK2010]Peaks加强版

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

  5. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  6. [ONTAK2010] Peaks 加强版

    [ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...

  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加强版

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

  9. ONTAK2010 Peaks加强版(离线&在线)

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

  10. BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)

    Orz PoPoQQQ 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间. 学到了怎么用指针写可持久化线段树-emmm- CODE 只贴上3551加强版带强制在线的代码 #incl ...

随机推荐

  1. android 国际化 设置

    复制了他人的方法 方法和步骤 1 配置选项包括语言代号和地区代号.表示中文和中国的配置选项是 zh-rCN; 表示英文和美国的配置选项是en-rUS.其中,zh 和 en 表示中文和英文: 2 如果想 ...

  2. urllib.urlencode() 无法encode中文, UnicodeEncodeError

    urllib.urlencode() 无法encode中文, UnicodeEncodeError, 具体错误内容如下:File "/System/Library/Frameworks/Py ...

  3. Python小白的发展之路之Python基础(三)【函数简介】

    目录: 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 4.嵌套函数 5.递归 6.匿名函数 7.函数式编程介绍 8.高阶函数 9.内置函数 1. 函数基本语法及特性 首先我们明确函数是 ...

  4. jquery 使用笔记

    一下是在做项目中用到jquery涉及到的一些知识点,把源码复制过来,省得以后忘记了: <link href="<%=request.getContextPath()%>/c ...

  5. Js中的Object.defineProperty

    通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等) 备注:如果通过var obj = {} obj.age = 18这种方式设置的属性, ...

  6. oracle decode 用法

    含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN ...

  7. QT5使用Webkti

    Qt 5.3 使用原来的QT4.8.4项目时QWebView .QWebFrame等类无法编译通过. 出现原因:QWebView .QWebFrame.QWebPage.QWebInspector等这 ...

  8. linux里的drwxr-xr-x代表的意思

    权限的计算是除去第一位字母开始,权限都是三个符号为一组合,其中-表示没有这个权限 d:第一位表示文件类型.d是目录文件,l是链接文件,-是普通文件,p是管道 rwx:第2-4位表示这个文件的属主拥有的 ...

  9. this.Hide()与this.Visible、Application.Exit与this.Close()区别

    首先明确this.Hide()和this.Visible作用完全一样,都是隐藏当前窗体,使其不可见:Application.Exit与this.Close()虽然都有关闭当前应用的作用,但作用不同. ...

  10. linux下无线鼠标驱动执行流程

    操作系统: debian 7.4(linux 3.2.54) 硬件: 一个无线鼠标.一个有线鼠标.usb集线器. 从淘宝上花了15块钱买了个无线鼠标,很好奇它的驱动程序是如何执行的. 首先将usb集线 ...