BZOJ 3545 带权限。

考虑离线,把所有边按照从小到大的顺序排序,把所有询问也按照从小到大的顺序排序,然后维护一个并查集和一个权值线段树,每处理一个询问就把比这个询问的$x$更小的边连上,具体来说就是合并两个并查集以及两棵线段树,查询的时候在线段树上走一走就好了。

要注意查询的第$k$大不是第$k$小,所以顺便再维护一个$siz$,如果$siz < k$那答案即为$-1$。

时间复杂度$O((m + q)logn)$。

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1e5 + ;
const int M = 5e5 + ;
const int inf = << ; int n, m, qn, a[N], mn = , mp[N], ufs[N], siz[N]; struct Innum {
int val, id; friend bool operator < (const Innum &x, const Innum &y) {
if(x.val == y.val) return x.id < y.id;
else return x.val < y.val;
} } in[N]; struct Pathway {
int u, v, val; friend bool operator < (const Pathway &x, const Pathway &y) {
return x.val < y.val;
} } path[M]; struct Querys {
int pos, val, k, id, res; friend bool operator < (const Querys &x, const Querys &y) {
return x.val < y.val;
} } q[M]; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline void discrete() {
sort(in + , in + + n);
in[].val = -inf;
for(int cnt = , i = ; i <= n; i++) {
if(in[i].val != in[i - ].val) ++cnt;
chkMax(mn, cnt);
a[in[i].id] = cnt;
mp[cnt] = in[i].val;
}
} namespace PSegT {
struct Node {
int lc, rc, sum;
} s[N * ]; int root[N], nodeCnt = , top = , pool[N * ]; #define lc(p) s[p].lc
#define rc(p) s[p].rc
#define sum(p) s[p].sum
#define mid ((l + r) >> 1) inline void push(int x) {
pool[++top] = x;
} inline int newNode() {
if(top) return pool[top--];
else return ++nodeCnt;
} void ins(int &p, int l, int r, int x) {
if(!p) p = newNode();
++sum(p);
if(l == r) return; if(x <= mid) ins(lc(p), l, mid, x);
else ins(rc(p), mid + , r, x);
} int go(int p, int l, int r, int x) {
if(l == r) return sum(p); if(x <= mid) return go(lc(p), l, mid, x);
else return go(rc(p), mid + , r, x);
} int query(int p, int l, int r, int k) {
if(l == r) return mp[l];
int now = sum(lc(p)); if(k <= now) return query(lc(p), l, mid, k);
else return query(rc(p), mid + , r, k - now);
} int merge(int u, int v, int l, int r) {
if(!u || !v) return u + v; int p = newNode();
if(l == r) sum(p) = sum(u) + sum(v);
else {
lc(p) = merge(lc(u), lc(v), l, mid);
rc(p) = merge(rc(u), rc(v), mid + , r);
sum(p) = sum(lc(p)) + sum(rc(p));
} push(u), push(v);
return p;
} } using namespace PSegT; inline void init() {
for(int i = ; i <= n; i++) {
ufs[i] = i;
siz[i] = ;
ins(root[i], , mn, a[i]);
}
} int find(int x) {
return ufs[x] == x ? x : ufs[x] = find(ufs[x]);
} inline void merge(int x, int y) {
int fx = find(x), fy = find(y);
if(fx == fy) return;
root[fx] = merge(root[fx], root[fy], , mn);
ufs[fy] = fx;
siz[fx] += siz[fy]; /* for(int i = 1; i <= mn; i++)
printf("%d ", go(root[fx], 1, mn, i));
printf("\n"); */
} int main() {
read(n), read(m), read(qn);
for(int i = ; i <= n; i++) {
read(a[i]);
in[i].val = a[i], in[i].id = i;
}
for(int i = ; i <= m; i++)
read(path[i].u), read(path[i].v), read(path[i].val);
for(int i = ; i <= qn; i++)
read(q[i].pos), read(q[i].val), read(q[i].k), q[i].id = i; sort(path + , path + + m), sort(q + , q + + qn); /* printf("\n");
for(int i = 1; i <= m; i++)
printf("%d %d %d\n", path[i].u, path[i].v, path[i].val);
printf("\n");
for(int i = 1; i <= qn; i++)
printf("%d %d %d\n", q[i].pos, q[i].val, q[i].k);
printf("\n"); */ discrete();
init(); /* for(int i = 1; i <= n; i++)
printf("%d ", a[i]);
printf("\n"); */ for(int j = , i = ; i <= qn; i++) {
for(; j <= m && path[j].val <= q[i].val; ++j)
merge(path[j].u, path[j].v);
int now = find(q[i].pos); /* for(int k = 1; k <= mn; k++)
printf("%d ", go(root[now], 1, mn, k));
printf("\n"); */ if(q[i].k > siz[now]) q[q[i].id].res = -;
else q[q[i].id].res = query(root[now], , mn, siz[now] - q[i].k + );
} for(int i = ; i <= qn; i++)
printf("%d\n", q[i].res); return ;
}

Luogu 4197 Peaks的更多相关文章

  1. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  2. Luogu P4197 Peaks

    题目链接 \(Click\) \(Here\) 做法:\(Kruskal\)重构树上跑主席树 构造方法:把每条边拆出来成一个点,点权是原先的边权.每次连边的时候,连的不再是点,而是其原先点所在的联通块 ...

  3. kruscal重构树略解

    我们先看一道题:Luogu P4197 Peaks 这道题珂以用启发式合并+主席树来做 那么强制在线呢?(bzoj 3551 [ONTAK2010]Peaks加强版) 离线做法就不行了 我们就要用一个 ...

  4. [BZOJ3551]Peaks

    [BZOJ3551]Peaks BZOJ luogu 建Kruskal重构树,点权为边权 按dfn序建出主席树 倍增找到能跳到的最浅的祖先 主席树查询一下 #include<bits/stdc+ ...

  5. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  6. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

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

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

  8. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  9. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

随机推荐

  1. 以前的实验博客地址,以前使用csdn

    实验一木马分析(隐藏分析)实验 http://blog.csdn.net/qq_30600405/article/details/78360599 实验二木马分析(控制分析)实验和实验三冰河木马实验 ...

  2. Brackets Sequence(升级版)

    个人心得:又是途径问题,我怕是又炸了.看了题解他的意思就是找出最短的添加顺序的断点,则只要 根据断点添加就好了,注意递归的奥妙之处吧,暂时还真得是拿他没办法. 题目描述: 定义合法的括号序列如下: 1 ...

  3. Excel合并计算

    office版本为2013,数据来源:我要自学网,曾贤志老师 计算之前,光标定在空白位置,不要定在数据源. 将汇总的类型居于首列(不可以跨区域选择,可以把不需要汇总的移动到其他列). 要有删除原来数据 ...

  4. Centos下安装禅道

    1.下载禅道安装包:http://dl.cnezsoft.com/zentao/9.7/ZenTaoPMS.9.7.stable.zbox_64.tar.gz 2.将下载的压缩包解压到/opt目录下: ...

  5. MySQL 5.7.10 自动备份、自动清理旧备份集(转)

    1,mysqldump备份脚本 备份脚本为,里面有几个需要注意的参数: (1)--master-data=2 :这个参数可以在搭建从库的时候,记录当前备份的复制点信息. (2)--extended-i ...

  6. Azure通过Vnet Peering和用户自定义路由(UDR)实现hub-spoken连接

    Azure的Vnet Peering可以把Azure中不同的Vnet连接起来的技术.底层是通过对NVGRE的租户标签进行修改,实现了不同租户间的互通.这种技术非常类似传统网络中MPLS/VPN不同租户 ...

  7. JAVA中数值的表示

    1.Java中用补码形式表示 2.第一位正负位,1表示负,0表示正. 3.原码:一个数的二进制表示.                  3的原码00000011   -3的 原码 10000011 4 ...

  8. 关于移动端的一些tip

    移动端的一些tip 开发相关 关于viewport <meta name="viewport" content="name=value,name=value&quo ...

  9. Spring之3:BeanFactory、ApplicationContext、ApplicationContextAware区别

    在Spring中系统已经为用户提供了许多已经定义好的容器实现,而不需要开发人员事必躬亲.相比那些简单拓展BeanFactory的基本IoC容器,开发人员常用的ApplicationContext除了能 ...

  10. 分布式锁之一:zookeeper分布式锁1

    zookeeper集群的每个节点的数据都是一致的, 那么我们可以通过这些节点来作为锁的标志. 首先给锁设置一下API, 至少要包含, lock(锁住), unlock(解锁), isLocked(是否 ...