本题解用于作者加深算法印象,也欢迎各位的阅读。

题目大意

给你一张无向图,并给你两种操作:

\(1~v\) :找到当前点 \(v\) 所在的联通块内权值最大的点,输出该点权值并将其权值改为 \(0\) 。

\(2~i\) :删去编号为 \(i\) 的边。

题解

然后你发现这个东西不是很好搞,但是这里提供了一个很好的维护联通块的东西——\(Kruskal\) 重构树。

我们可以将每条边删去的时间戳记为这条边的权值,可以轻易的发现,如果我们将边权从大到小(即在时间上从后往前)建起 \(Kruskal\) 重构树的话,每个子树都代表着一个时间点上的联通块,我们只需要对这个子树做我们的 \(1\) 操作就可以了,这个可以用 \(dfs\) 序加线段树来实现,这里就不多赘述了。

以上。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=3e5+5,Q=5e5+5;
int n,m,q,a[N<<1],b[N<<1];
struct Edge{int u,v,w,tag;}e[M];
bool cmp(Edge a,Edge b){return a.tag>b.tag;}
struct operation{int opt,x;}s[Q];
struct Seg_Tree
{
struct Node{int data,pos;}tr[N<<4];
void up(int u)
{
if(tr[u<<1].data>tr[u<<1|1].data) tr[u]=tr[u<<1];
else tr[u]=tr[u<<1|1];
}
void build(int u,int l,int r,int a[])
{
if(l==r){tr[u].data=a[l],tr[u].pos=l;return;}
int mid=(l+r)>>1;
build(u<<1,l,mid,a),build(u<<1|1,mid+1,r,a);
up(u);
}
int query(int u,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return u;
int mid=(l+r)>>1,res=0,tmp;
if(x<=mid)
{
tmp=query(u<<1,l,mid,x,y);
if(tr[res].data<=tr[tmp].data) res=tmp;
}
if(y>mid)
{
tmp=query(u<<1|1,mid+1,r,x,y);
if(tr[res].data<=tr[tmp].data) res=tmp;
}
return res;
}
void del(int u,int l,int r,int x)
{
if(x<=l&&r<=x){tr[u].data=0;return;}
int mid=(l+r)>>1;
if(x<=mid) del(u<<1,l,mid,x);
else del(u<<1|1,mid+1,r,x);
up(u);
}
}Seg;
struct Kruskal_Tree
{
int size;
struct DSU
{
int fa[N<<1];
void init(){for(int i=1;i<(N<<1);++i)fa[i]=i;}
int find(int x){if(fa[x]!=x)fa[x]=find(fa[x]);return fa[x];}
}d;
struct Edge{int nxt,to;}e[N<<1];
int fir[N<<1],e_size;
void add(int u,int v){e[++e_size]=Edge{fir[u],v},fir[u]=e_size;}
struct Node{int fa[22],dep,data,mp;}tr[N<<1];
int dfn[N<<1],l[N<<1],r[N<<1],dfn_num;
void dfs(int u)
{
dfn[++dfn_num]=u,tr[u].mp=dfn_num;
l[u]=dfn_num;
// printf("%d %d\n",u,tr[u].data);
for(int i=fir[u];i;i=e[i].nxt)
{
tr[e[i].to].fa[0]=u;
tr[e[i].to].dep=tr[u].dep+1;
dfs(e[i].to);
}
r[u]=dfn_num;
}
int lca(int u,int v)
{
if(tr[u].dep<tr[v].dep) swap(u,v);
for(int i=20;i>=0;--i)
{
if(tr[tr[u].fa[i]].dep>=tr[v].dep)
u=tr[u].fa[i];
}
if(u==v) return u;
for(int i=20;i>=0;--i)
{
if(tr[u].fa[i]!=tr[v].fa[i])
u=tr[u].fa[i],v=tr[v].fa[i];
}
return tr[u].fa[0];
}
}t;
int main()
{
cin>>n>>m>>q;
t.size=n,t.d.init();
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=m;++i) scanf("%d%d",&e[i].u,&e[i].v),e[i].tag=q+1;
// printf("\n----------------\n");
for(int i=1;i<=q;++i)
{
scanf("%d%d",&s[i].opt,&s[i].x);
if(s[i].opt==2) e[s[i].x].tag=i;
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;++i)
{
int fu=t.d.find(e[i].u);
int fv=t.d.find(e[i].v);
if(fu==fv) continue;
t.tr[++t.size].data=e[i].tag;
t.add(t.size,fu),t.add(t.size,fv);
// printf("%d %d %d\n",t.size,fu,fv);
t.d.fa[fu]=t.d.fa[fv]=t.size;
}
for(int i=1;i<=t.size;++i)
{
int tmp=t.d.find(i);
if(t.tr[tmp].mp) continue;
t.tr[tmp].dep=1;
t.dfs(tmp);
}
// for(int i=1;i<=t.size;++i)
// {
// printf("%d %d %d\n",t.tr[i].fa[0],t.tr[i].dep,t.tr[i].data);
// }
for(int i=1;i<=20;++i)
{
for(int j=1;j<=t.size;++j)
t.tr[j].fa[i]=t.tr[t.tr[j].fa[i-1]].fa[i-1];
}
for(int i=1;i<=t.size;++i) b[i]=a[t.dfn[i]];
Seg.build(1,1,t.size,b);
for(int i=1;i<=q;++i)
{
if(s[i].opt==2) continue;
int tmp=s[i].x;
for(int j=20;j>=0;--j)
{
if(t.tr[t.tr[tmp].fa[j]].data>i)
tmp=t.tr[tmp].fa[j];
}
tmp=Seg.query(1,1,t.size,t.l[tmp],t.r[tmp]);
// printf("%d %d ",tmp,Seg.tr[tmp].pos);
printf("%d\n",Seg.tr[tmp].data);
Seg.del(1,1,t.size,Seg.tr[tmp].pos);
}
}

CF1416D Graph and Queries的更多相关文章

  1. HDU 3726 Graph and Queries 平衡树+前向星+并查集+离线操作+逆向思维 数据结构大综合题

    Graph and Queries Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. [la P5031&hdu P3726] Graph and Queries

    [la P5031&hdu P3726] Graph and Queries Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: ...

  3. HDU 3726 Graph and Queries (离线处理+splay tree)

    Graph and Queries Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. HDU 3726 Graph and Queries treap树

    题目来源:HDU 3726 Graph and Queries 题意:见白书 思路:刚学treap 參考白皮书 #include <cstdio> #include <cstring ...

  5. HDU 3726 Graph and Queries(平衡二叉树)(2010 Asia Tianjin Regional Contest)

    Description You are given an undirected graph with N vertexes and M edges. Every vertex in this grap ...

  6. UVALive5031 Graph and Queries(Treap)

    反向操作,先求出最终状态,再反向操作. 然后就是Treap 的合并,求第K大值. #include<cstdio> #include<iostream> #include< ...

  7. UVa 1479 (Treap 名次树) Graph and Queries

    这题写起来真累.. 名次树就是多了一个附加信息记录以该节点为根的树的总结点的个数,由于BST的性质再根据这个附加信息,我们可以很容易找到这棵树中第k大的值是多少. 所以在这道题中用一棵名次树来维护一个 ...

  8. uvalive 5031 Graph and Queries 名次树+Treap

    题意:给你个点m条边的无向图,每个节点都有一个整数权值.你的任务是执行一系列操作.操作分为3种... 思路:本题一点要逆向来做,正向每次如果删边,复杂度太高.逆向到一定顺序的时候添加一条边更容易.详见 ...

  9. 【HDOJ】3726 Graph and Queries

    Treap的基础题目,Treap是个挺不错的数据结构. /* */ #include <iostream> #include <string> #include <map ...

随机推荐

  1. select模型(一 改进客户端)

    一.改程序使用select来改进客户端对标准输入和套接字输入的处理,否则关闭服务器之后循环中的内容都要被gets阻塞.原程序中https://www.cnblogs.com/wsw-seu/p/841 ...

  2. SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)

    SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...

  3. C#设计模式-外观模式(Facade Pattern)

    引言 在软件测试中,一般都是在功能测试稳定的情况下再进行UI自动化测试.或者进行性能测试.如果一个一个进行太麻烦,此时可以使用对外提供一个简单接口,通过这个接口可以访问内部一群接口.例如进行UI自动化 ...

  4. 【C++】归并排序

    性能分析: 时间复杂度:O(n*log(n)) 空间复杂度:O(n) 归并排序算法来自于分而治之思想,"归"是"递归"的意思,"并"是&qu ...

  5. CorelDRAW常用工具之涂抹工具

    CDR作为绘图软件或者说平面设计软件使用频繁的功能之一,就是为绘制好的图片进行涂抹混色. 1.基本操作 CorelDRAW平面设计软件的涂抹工具是在形状工具组里的,打开左侧工具栏"形状&qu ...

  6. 如何在PDF文档上加水印

    当我们需要传输一些比较重要的文件时,往往会选择将文档转换为PDF文件,避免其他人复制.更改文档的内容. pdfFactory不仅可以为用户提供快速创建PDF的功能,同时还提供了添加水印的功能.有了水印 ...

  7. 怎么用思维导图软件iMindMap整理发文思路

    如果你是一个普通的博客作者,那么你就应该明白在枯竭时寻找灵感就像是一场噩梦,即使你有一千个想法,但是你无法将它们关联起来也是无用的,所以,为什么不试试iMindMap思维导图呢,尝试创新,进行组建,你 ...

  8. 【linux】系统调用版串口分析&源码实战

    目录 前言 参考 1. 实战分析 1.1 开发步骤 1.1.1 获取串口设备路径 1.1.2 打开设备文件 1.1.3 配置串口 termios 结构体 1. c_iflag 输入模式标志 2. c_ ...

  9. Linux 学习笔记04丨Linux的用户和用户组管理

    Chapter 3. 用户和用户组管理 由于Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以该账号身份进入系统. 3.0 用户与 ...

  10. 怎样安装Arch Linux以及Deepin桌面环境

    一.概述 Arch Linux 是一个轻量级的Linux发行版本,实际上,Arch Linux提供给用户很多选择,用户可以自定义自己的安装过程,不x像其他很多的Linux发行版本,安装过程甚至是一个只 ...