「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接
【洛谷】
【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【线段树合并】的更多相关文章
- 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)
题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...
- 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)
传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- 洛谷 P1083 借教室【二分+差分/线段树】
二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...
- 【洛谷4219】[BJOI2014]大融合(线段树分治)
题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...
- LOJ2537. 「PKUWC2018」Minimax【概率DP+线段树合并】
LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小 ...
- 洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
题意 题目链接 Sol 说一个后缀自动机+线段树的无脑做法 首先建出SAM,然后对parent树进行dp,维护最大次大值,最小次小值 显然一个串能更新答案的区间是\([len_{fa_{x}} + 1 ...
随机推荐
- c#中如何使用到模糊查询
c#中如何使用到模糊查询,先举个最简单实用的例子,可在vs控制台应用程序中输出: 定义实体类: public class Student { public int ...
- Springboot整合activemq
今天呢心血来潮,也有很多以前的学弟问到我关于消息队列的一些问题,有个刚入门,有的有问题都来问我,那么今天来说说如何快速入门mq. 一.首先说下什么是消息队列? 1.消息队列是在消息的传输过程中保存消息 ...
- dubbo-源码分析Consumer
counsumer使用服务的时候会在xml中配置<dubbo:reference> dubbo在spring.handles里的NamespaceHandle又有如下配置: registe ...
- Java学习点滴——Integer缓存
前言 一切从下面这段代码开始 public static void test(String[] agrs){ Integer a = 1; Integer b = 2; System.out.prin ...
- IntelliJ IDEA下的使用git
1.git简介 git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...
- openlayers 3方法继承
之前Web GIS开发使用的ArcGIS API用起来很系统,但是使用开源Web GIS API已经成主流趋势(你懂的~),最近项目想要从ArcGIS API 转到openlayers API,用起来 ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- arcgis api 4.x for js之图层管理篇
上篇实现了基础地图加载以及二三维模式切换:本篇的内容则是图层管理控制,从两个不同角度来实现,分别是直接绑定arcgis api提供的图层管理widget(LayerList)以及自定义图层管理图标的点 ...
- docker 集群 zookeeper 碰到 java.net.NoRouteToHostException: Host is unreachable (Host unreachable)
最近在学 zookeeper ,按照 docker 官网的方式集群 zookeeper , 然后发现有路由找不到.最后问题解决了,随手记录下来. 原因是 firewalld 的没有信任 docker ...
- 好代码是管出来的——使用GitHub
前面的文章介绍了Git的基本概念和用法,本文则是基于GitHub的一个实践介绍,主要内容有: GitHub简介 个人与组织 仓库的创建与维护 Fork与pull request 小结 GitHub简介 ...