题目链接

【洛谷】
【BZOJ】没有权限号嘤嘤嘤。题号:3545

题解

窝不会克鲁斯卡尔重构树怎么办???
可以离线乱搞。
我们将所有的操作全都存下来。
为了解决小于等于\(x\)的操作,那么我们按照长度来排一个序。
如果询问和加边长度相同,这加边优先。
对于每一个连通块进行权值线段树。
权值线段树解决\(k\)大的问题。
每一次合并,并查集判联通,线段树暴力合并。
时间复杂度\(O(nlogn)\)。

代码

#include <bits/stdc++.h>
using namespace std;
namespace IOstream {
    #define gc getchar
    template <typename T>
    inline void read(T &x) {
        x = 0; T fl = 1; char c = 0;
        for (; c < '0' || c > '9'; c = gc())
            if (c == '-') fl = -1;
        for (; c >= '0' && c <= '9'; c = gc())
            x = (x << 1) + (x << 3) + (c ^ 48);
        x *= fl;
    }
    #undef gc
} using namespace IOstream;
int n, m, q;
const int N = 100000 + 5;
int val[N], id[N];
namespace seg {
    #define ls(x) tr[x].lc
    #define rs(x) tr[x].rc
    struct node {
        int lc, rc, s; node() { lc = rc = s = 0; }
    } tr[N * 50];
    int tot = 0;
    void upd(int &k, int l, int r, int val) {
        if (!k) k = ++ tot;
        tr[k].s = 1;
        if (l == r) return;
        int mid = (l + r) >> 1;
        if (val <= mid) upd(ls(k), l, mid, val);
        else upd(rs(k), mid + 1, r, val);
    }
    int kth(int k, int l, int r, int rk) {
        if (l == r) return l;
        int mid = (l + r) >> 1;
        if (rk <= tr[ls(k)].s) return kth(ls(k), l, mid, rk);
        else return kth(rs(k), mid + 1, r, rk - tr[ls(k)].s);
    }
    int merge(int x, int y) {
        if (!x || !y) return x + y;
        if (!ls(x) && !rs(x)) { tr[x].s += tr[y].s; return x; }
        ls(x) = merge(ls(x), ls(y));
        rs(x) = merge(rs(x), rs(y));
        tr[x].s = tr[ls(x)].s + tr[rs(x)].s;
        return x;
    }
}
struct ASK {
    int a, b, c, d, id;
} Q[N * 10];
int fa[N], rt[N], ans[5 * N];
bool cmp_ASK(ASK A, ASK B) {
    return A.c == B.c ? A.d < B.d : A.c < B.c;
}
int gf(int x) {
    return x == fa[x] ? fa[x] : fa[x] = gf(fa[x]);
}
signed main() {
    read(n); read(m); read(q);
    for (int i = 1; i <= n; i ++) read(val[i]), id[i] = val[i], fa[i] = i;
    sort(id + 1, id + 1 + n);
    for (int i = 1; i <= n; i ++)
        val[i] = lower_bound(id + 1, id + 1 + n, val[i]) - id;
    for (int i = 1; i <= m; i ++)
        read(Q[i].a), read(Q[i].b), read(Q[i].c), Q[i].d = 0;
    for (int i = m + 1; i <= m + q; i ++)
        read(Q[i].a), read(Q[i].c), read(Q[i].b), Q[i].d = 1, Q[i].id = i - m;
    sort(Q + 1, Q + 1 + m + q, cmp_ASK);
    for (int i = 1; i <= n; i ++) seg::upd(rt[i], 1, n, val[i]);
    for (int i = 1; i <= m + q; i ++) {
        if (!Q[i].d) {
            int x = gf(Q[i].a), y = gf(Q[i].b);
            if (x != y) {
                fa[x] = y;
                rt[y] = seg::merge(rt[x], rt[y]);
            }
        } else {
            int x = gf(Q[i].a);
            if (seg::tr[rt[x]].s < Q[i].b) ans[Q[i].id] = -1;
            else ans[Q[i].id] = id[seg::kth(rt[x], 1, n, seg::tr[rt[x]].s - Q[i].b + 1)];
        }
    }
    for (int i = 1; i <= q; i ++) printf("%d\n", ans[i]);
    return 0;
}

「洛谷4197」「BZOJ3545」peak【线段树合并】的更多相关文章

  1. 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)

    题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...

  2. 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)

    传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...

  3. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

  4. 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)

    To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...

  5. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  6. 洛谷 P1083 借教室【二分+差分/线段树】

    二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...

  7. 【洛谷4219】[BJOI2014]大融合(线段树分治)

    题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...

  8. LOJ2537. 「PKUWC2018」Minimax【概率DP+线段树合并】

    LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小 ...

  9. 洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)

    题意 题目链接 Sol 说一个后缀自动机+线段树的无脑做法 首先建出SAM,然后对parent树进行dp,维护最大次大值,最小次小值 显然一个串能更新答案的区间是\([len_{fa_{x}} + 1 ...

随机推荐

  1. 【Springboot】Springboot整合Thymeleaf模板引擎

    Thymeleaf Thymeleaf是跟Velocity.FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他的模板引擎,它主要有以下几个特点: 1. Thymeleaf在有网络和无 ...

  2. Vue项目需求实现记录(永久更新)

    1.表单校验功能: 在el-form标签中定义:rules="rules";ref="reference" 在el-form-item定义prop=" ...

  3. px妙转rem

    px:像素,相对长度单位,相对于显示器屏幕的分辨率而言(其实我个人认为可以理解为固定单位): rem:这是个web前端中的新成员,是CSS3中新增的一个相对单位.相对的只是html根元素: 1.设定两 ...

  4. servlet与jsp篇(一)$.ajax交互

    servlet其实是利用java类编写的服务器端应用程序,他的生命周期可以分为三个阶段:初始化阶段.运行阶段和消亡阶段; jsp页面实质上是一个HTML页面,但他包含了用户产生动态网页内容的java代 ...

  5. (四) Keras Dropout和正则化的使用

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 使用drop ...

  6. 关于Java 中跳出多重循环

    前言 环境:window10 JDK 1.8 应用场景:在多个for循环或while循环中,直接跳到最外层的循环外面,而不是需要层层退出来. 使用: 使用一个标签label(也可以是其他单词,不能是关 ...

  7. [idea] SpringBoot整合swagger2实现CRUD

    一:创建SpringBoot ,在pom.xml文件中加入jar包 <dependency> <groupId>io.springfox</groupId> < ...

  8. Python之Scripy框架

    为什么要用到cmd界面 --- 在这里操作的是Scripy框架的指令,不是Python代码 Parse --- Scripy的回调函数 fiddler --- 用于爬取JS存储数据的页面 项目: 1. ...

  9. Rsync + sersync 实时同步备份

    一      Rsync + Sersync  实时同步介绍 1.Rsync 服务搭建介绍 云机上搭建Rsync server,在本地搭建Rsync Clinet. 2. Sersync 服务搭建介绍 ...

  10. Cleartext HTTP traffic to xxx not permitted解决办法

    ,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 ...