题目链接

【洛谷】
【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. [转]Python in Visual Studio Code

    本文转自:https://code.visualstudio.com/docs/languages/python Working with Python in Visual Studio Code, ...

  2. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

  3. Java 数组及数组常用算法

    1 数组也是一种类型 Java中要求所有的数组元素具有相同的数据类型.因此在一个数组中,数组元素的类型是唯一的,不能存储多种类型的数据. 一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此 ...

  4. 如何将数据库中的值经过servlet传入到jsp页面,并且用EL表达式显示出值

    方法一:通过id查询某一数据库表中具体的行,将值封装在相应的对象中,如下面的对象Notice servlet中 String noticeId=request.getParameter("n ...

  5. 服务器四:多进程epoll

    #include <fcntl.h> #include <sys/socket.h> #include <netinet/in.h> #include <ar ...

  6. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. vue build报copy-webpack-plugin] unable to locate异常的解决方法

    ERROR in [copy-webpack-plugin] unable to locate 'J:\xxx\xxx\xxx\xxx\static' at 'J:\xxx\xxx\xxx\xxx\s ...

  8. iBatis第二章:搭建一个简单的iBatis开发环境

    使用 iBatis 框架开发的基本步骤如下:1.新建项目(iBatis是持久层框架,可以运用到java工程或者web工程都可以) 这里我们建立一个 web 工程测试. 2.导入相应的框架 jar 包 ...

  9. 微软与开源干货对比篇_PHP和 ASP.NET在 Session实现和管理机制上差异

    微软与开源干货对比篇_PHP和 ASP.NET在 Session实现和管理机制上差异 前言:由于开发人员要靠工具吃饭,可能和开发工具.语言.环境呆的时间比和老婆孩子亲人在一起的时间还多,所以每个人或多 ...

  10. PostgreSQL For Windows 全功能精简版

    预览 精简部分 保留全部 PostgreSQL 相关功能 删除自带的 pgadmin 4 删除文档 删除开发用头文件 删除开发用静态连接库 删除 Stack Build 工具 写了一个管理数据库用的批 ...