题目链接

【洛谷】
【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. 无需***,轻松提速 Github

    无需***,轻松提速 Github 众所周知,Github 是全球程序员最喜欢访问的网站之一,但是在国内,会很容易出现一个水土不服的局面 -- 下载不了(稍微大一点中途就报错了),下载速度慢 .... ...

  2. asp.net easyui 动态绑定下拉框

    前台: <title>标题</title> <link href="EasyUi_v1.3.4/easyui/themes/default/easyui.css ...

  3. String方法

    String 大小写转换: String str = "ABC";String str1 = "abc"; System.out.println("A ...

  4. HashMap源码分析 JDK1.8

    本文按以下顺序叙述: HashMap的感性认识. 官方文档中对HashMap介绍的解读. 到源码中看看HashMap这些特性到底是如何实现的. 把源码啃下来有一种很爽的感觉, 相信你读完后也能体会到~ ...

  5. http header Content-Type之常用三种

    Content-Type 用于指示资源的MIME类型 在响应头中,告诉客户端实际返回内容的类型 在请求头中,告诉服务器实际发送的数据类型 句法: Content-Type: text/html; ch ...

  6. 一个基于OCV的人肉选取特征点程序

    基于OpenCV写了一个交互式获取图片上的人肉选取的特征,并保存到文件的小程序. 典型应用场景:当在一个精度不高的应用需求中,相机分辨率差或者变形严重,某些棋盘点通过代码检测不出,就可以通过手工选取的 ...

  7. Numpy库的学习(四)

    我们今天继续学习一下Numpy库 接着前面几次讲的,Numpy中还有一些标准运算 a = np.arange(3) print(a) print(np.exp(a)) print(np.sqrt(a) ...

  8. Git - git status - 查看当前仓库状态

    索引: 目录索引 参看代码 GitHub: git.txt 一.示例: git status 二.说明: 1."status" 部分 该命令可以查出当前分支文件变更状态, 可以查出 ...

  9. 点击 Button触发事件将GridView1 CheckBox勾选的行添加到GridView2中

    有时候想实现一个CheckBox选取功能,但是很多细节不是很清楚 相信大家都有遇到类似的情况,直接看代码,如下: 前端代码GridView1,CheckBox控件设置 <asp:GridView ...

  10. [20190419]shared latch spin count 2.txt

    [20190419]shared latch spin count 2.txt --//上午测试shared latch XX模式的情况,链接:http://blog.itpub.net/267265 ...