JZOJ 5174
\(\text{Problem}\)
给你一张 \(n\) 个结点,\(m\) 条边的无向图,每个结点都有一个整数权值。你需要执行一系列操作。操作分为三种,如下表所示。
操作
备注
\(\text{D x (1<=x<=m)}\)
删除编号为x的边。输入保证每条边至多被删除一次。
\(\text{Q x k (1<=x<=n)}\)
计算出结点x所在的联通块中,第k大的权值。如果不存在,输出 \(0\)。
\(\text{C x v (1<=x<=n)}\)
把结点 \(x\) 的权值改为 \(v\)。
操作序列的结束标志为单个字母 \(E\) 。结点编号为 \(1\) 到 \(n\),边的编号为 \(1\) 到 \(m\)。
\(\text{Solution}\)
参见 \(\text{HNOI2012}\) 永无乡
因为删边的操作并不容易实现,而题目有没要求在线
于是考虑离线变删边为加边
那就和那题一样了
注意值域与空间
\(\text{Code}\)
#include<cstdio>
using namespace std;
const int N = 2e4 + 5, QN = 3e5 + 5, Sz = 2e5 * 45;
int L, R, n, m, q, size, fa[N], a[N], rt[N], ans[QN];
int sum[Sz], ls[Sz], rs[Sz];
struct node{int x, y, w;}E[3 * N], Q[2 * QN];
inline void read(int &x)
{
x = 0; char ch = getchar(); int f = 1;
while (ch < '0' || ch > '9') f = (ch == '-' ? -1 : f), ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
x *= f;
}
inline void pushup(int p){sum[p] = sum[ls[p]] + sum[rs[p]];}
void merge(int &x, int y, int l, int r)
{
if (!x || !y) return void(x += y);
if (l == r) return void(sum[x] += sum[y]);
int mid = (l + r) >> 1;
merge(ls[x], ls[y], l, mid);
merge(rs[x], rs[y], mid + 1, r);
pushup(x);
}
int find(int x){return (fa[x] == x ? x : fa[x] = find(fa[x]));}
inline void dsu_union(int x, int y)
{
int u = find(x), v = find(y);
if (u == v) return;
fa[v] = fa[u];
merge(rt[u], rt[v], L, R);
rt[v] = 0;
}
void update(int &p, int l, int r, int x, int v)
{
if (!p) p = ++size;
if (l == r) return void(sum[p] += v);
int mid = (l + r) >> 1;
if (x <= mid) update(ls[p], l, mid, x, v);
else update(rs[p], mid + 1, r, x, v);
pushup(p);
}
int query(int p, int l, int r, int x)
{
if (sum[p] < x) return 0;
if (l == r) return l;
int mid = (l + r) >> 1;
if (sum[rs[p]] >= x) return query(rs[p], mid + 1, r, x);
return query(ls[p], l, mid, x - sum[rs[p]]);
}
int main()
{
L = -1e6, R = 1e6;
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i]);
for(int i = 1, x, y; i <= m; i++) read(E[i].x), read(E[i].y), E[i].w = 1;
char op[5];
for(int i = 1, x, y; ; i++)
{
scanf("%s", op);
if (op[0] == 'E') break;
read(x);
if (op[0] == 'D') E[x].w = 0, Q[i] = node{x, 0, 1};
else if (op[0] == 'Q') read(y), Q[i] = node{x, y, 2};
else read(y), Q[i] = node{x, a[x], 3}, a[x] = y;
q = i;
}
for(int i = 1; i <= n; i++) fa[i] = i, update(rt[i], L, R, a[i], 1);
for(int i = 1; i <= m; i++)
if (E[i].w == 1) dsu_union(E[i].x, E[i].y);
for(int i = q; i; i--)
{
if (Q[i].w == 1) dsu_union(E[Q[i].x].x, E[Q[i].x].y);
else{
int now = rt[find(Q[i].x)];
if (Q[i].w == 2) ans[++ans[0]] = query(now, L, R, Q[i].y);
else update(now, L, R, a[Q[i].x], -1), update(now, L, R, a[Q[i].x] = Q[i].y, 1);
}
}
for(int i = ans[0]; i; i--) printf("%d\n", ans[i]);
}
JZOJ 5174的更多相关文章
- Valentine's Day Round 1001.Ferries Wheel(hdu 5174)解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1] ...
- (jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...
- [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)
Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
- [jzoj]5478.【NOIP2017提高组正式赛】列队
Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校 ...
- [jzoj]1115.【HNOI2008】GT考试
Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...
- [jzoj]2538.【NOIP2009TG】Hankson 的趣味题
Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- [jzoj]2938.【NOIP2012模拟8.9】分割田地
Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...
- [jzoj]2505.【NOIP2011模拟7.29】藤原妹红
Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...
随机推荐
- HTTP Analyzer 伴侣,解决Probably another instance is already up
解决方案1: NET START HttpAnalyzer_StdV7_NetFilter START start HttpAnalyzerStdV7.exe将以上内容保存为.bat 解决方案2: p ...
- Linux 使用打印机
前言 在 deepin 上打印机好使,在我的mint上不好使,简单的查看一下deepin上驱动及软件.安装上就行了. 软件及驱动 ii hpijs-ppds 3.18.12+dfsg0-2 all H ...
- 2.2:常用的Python数据类型、字符串、dtype
一.内置数据类型 1.整型 2.浮点型 3.字符串 4.复数 5.布尔类型bool 6.None类型 二.字符串 1.从键盘输入数据 s = input() 2.用eval去引号求值 eval(&qu ...
- apache文件工具类的使用:org.apache.commons.io.FileUtils
说明 org.apache.commons.io.FileUtils 工具类包含了许多操作文件的方法,此文章介绍一些常用的文件操作方法,方便使用的时候查阅参考 创建输入流 public static ...
- pycharm恢复删除文档与查询修改前数据
1.pycharm恢复删除文档 第一步: 第二步: 2.pycharm查询修改前文档数据 第一步: 第二步:
- Vuex从入门到精通
一.vuex介绍 目标 什么是Vuex 为什么学习Vuex 通信方案 组件关系 数据通信 父子关系 父传子:props : 子传父:$emit 非父子关系 vuex (一种组件通信方案) Vuex是什 ...
- [OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形
目录 1 什么是仿射变换? 2 使用OpenCV进行三角形仿射变换 2.1 定义输入和输出 2.2 计算边界框 2.3 裁剪图像和更改坐标 2.4 计算仿射变换矩形 2.5 应用仿射变换到三角形 2. ...
- Js文件名 排序
参考了别人帖子后,调整之后的排序方法,更加精确.(参考链接在底部) 压缩版 function strCompare(str1,str2){if(str1==undefined&&str ...
- [cocos2d-x]判断两个矩形是否有交叉区域
bool Rect::intersectsRect(const Rect& rect) const { return !( getMaxX() < rect.getMinX() || r ...
- P1605迷宫——题解
展开 题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次 ...