\(\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的更多相关文章

  1. 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] ...

  2. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  3. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  4. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  5. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  6. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  7. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  8. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  9. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

  10. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

随机推荐

  1. 解决sox报错sox FAIL formats: no handler for given file type `mp3

    sudo apt-get install libsox-fmt-mp3

  2. os sys json模块

    Day19 os sys json 今日内容概要 os模块 sys模块 json模块 json模块实践 今日内容详细 一.os模块 os模块主要与代码运行所在的操作系统打交道 import os 1. ...

  3. 如何搭建自己的CICD流水线,实现自动编译部署功能?

    之前使用过GitLab的CICD流水线,有多种环境,点击即可编译部署,十分的方便. 如何在个人项目中搭建自己的CICD流水线,实现push代码后自动编译并部署呢?这里使用到阿里云 云效DevOps,阿 ...

  4. 一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中自定义控件制作和调用、TCP协议下文件的收发 、以及可执行文件的打包

    一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中ui的使用和TCP协议下文件的收发.以及可执行文件的打包 写在前面,Qt Designer是一个非常操蛋的页面编辑器,它非常的...怎么说呢 ...

  5. js的基本数据类型和引用数据类型及深拷贝浅拷贝

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.js数据类型分两种 (1)基本数据类型(值类型):Nu ...

  6. day14-功能实现13

    家居网购项目实现013 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 32.功能30-会员不能登录后台管理 32.1需求分析/ ...

  7. Redis 数据结构-双向链表

    Redis 数据结构-双向链表 最是人间留不住,朱颜辞镜花辞树. 1.简介 Redis 之所以快主要得益于它的数据结构.操作内存数据库.单线程和多路 I/O 复用模型,进一步窥探下它常见的五种基本数据 ...

  8. [C++]vector内存的增长机制

    例子 #include <iostream> #include<vector> #include<algorithm> #include "CPPDemo ...

  9. 动力节点——day03

    接收键盘的输入:1.创建一个键盘扫描器对象 java.util.Scanner s=new Scanner(System.in); 2.接收用户输入s.nextInt(); 静态变量在类加载的时候就分 ...

  10. 【ASP.NET Core】动态映射MVC路由

    ASP.NET Core 中的几大功能模块(Razor Pages.MVC.SignalR/Blazor.Mini-API 等等)都以终结点(End Point)的方式公开.在HTTP管道上调用时,其 ...