\[\text{Preface}
\]

算是一道思维难度稍易,代码难度稍难的题吧。

\[\text{Description}
\]

给出一张 \(n\) 个点,\(m\) 条边的图,点带权。需要支持三个操作:

  • D x 删掉编号为 \(x\) 的边
  • Q x k 查询与节点 \(x\) 联通的所有节点中,点权第 \(k\) 大节点的点权
  • C x v 将节点 \(x\) 点权改为 \(v\)

多组数据,每组数据最终需要输出所有查询的平均值 ( 保留 6 位 ) ,没有强制在线。

\[\text{Solution}
\]

不知道大家有没有做过 这道题 ,推荐先去做一下。

\(~\)

首先,对于同一个连通块里的所有节点,查询与任意一个节点连通的所有节点的第 \(k\) 大,都是查询该连通块里所有节点的第 \(k\) 大。已经很明显可以用并查集维护每个连通块的代表节点,再在这个代表节点上用一个数据结构维护连通块信息,支持合并,查询第 \(k\) 大。

我们发现权值线段树可以做到上述操作,尝试用权值线段树维护,每个节点开一个权值线段树。

\(~\)

对于操作 Q x k \(:\)

​ ​ ​ ​ 权值线段树基本操作。

对于操作 C x v \(:\)

​​ ​ ​ ​ 我们可以看作是在 \(x\) 这个位置上少了一个原来的点权,再多了一个新的点权,两次插入操作即可解决。

对于操作 D x \(:\)

​ ​ ​ ​ \(......\) ,我们发现删掉一条边,不能有效使得一个连通块分裂成两个连通块,并且维护权值线段树。

\(~\)

注意到此题 没有强制在线 ,意味着,我们可以离线地把所有操作都读进来,然后去反着考虑这些询问。

这样一来,D x 操作就可以变为 \(:\) 加入一条编号为 \(x\) 的边。其余的两个操作不变。

我们发现添加一条边很容易维护 \(:\) 找出 \(u,v\) 所在的连通块 \(p,q\) ,若 \(p=q\) ,则无需操作;否则合并权值线段树 \(p\) 和权值线段树 \(q\) ,然后令 \(fa[q]=p\) 。

综上所述,我们就可以用 权值线段树 \(+\) 并查集 解决本题了。\((\) 当然什么 \(splay\),\(treap\) 启发式合并也行 \()\)

时空复杂度 \(\text{O(n log n)}\) 。

\[\text{Code}
\]

#include<cstdio>
#include<cstring> #define RI register int using namespace std; inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
} const int N=6000100,M=6000100,Q=6000100,MLOGN=50000000; const int INF=1e6; int T;
int n,m,q; int cnt;
long double ans; int val[N]; struct Edge{
int u;
int v;
bool del;
}e[M]; char opt[Q];
int x[Q],k[Q]; int fa[N]; int get(int x)
{
if(fa[x]==x)return x;
return fa[x]=get(fa[x]);
} int tot,root[N];
struct SegmentTree{
int lc,rc;
int cnt;
}t[MLOGN]; int New()
{
tot++;
t[tot].lc=t[tot].rc=t[tot].cnt=0;
return tot;
} void insert(int &p,int l,int r,int delta,int val)
{
if(!p)
p=New();
t[p].cnt+=val;
if(l==r)return;
int mid=(l+r)>>1;
if(delta<=mid)
insert(t[p].lc,l,mid,delta,val);
else
insert(t[p].rc,mid+1,r,delta,val);
} int merge(int p,int q)
{
if(!p||!q)
return p^q;
t[p].cnt+=t[q].cnt;
t[p].lc=merge(t[p].lc,t[q].lc);
t[p].rc=merge(t[p].rc,t[q].rc);
return p;
} int ask(int p,int l,int r,int k)
{
if(l==r)
return l;
int mid=(l+r)>>1;
int rcnt=t[t[p].rc].cnt;
if(k<=rcnt)
return ask(t[p].rc,mid+1,r,k);
else
return ask(t[p].lc,l,mid,k-rcnt);
} void link(int u,int v)
{
u=get(u),v=get(v); if(u==v)return; root[u]=merge(root[u],root[v]);
fa[v]=u;
} void work()
{
tot=cnt=ans=q=0;
memset(root,0,sizeof(root)); for(RI i=1;i<=n;i++)
val[i]=read(); for(RI i=1;i<=m;i++)
e[i].u=read(),e[i].v=read(); char tmp[2];
while(scanf("%s",tmp),tmp[0]!='E')
{
opt[++q]=tmp[0];
switch(tmp[0])
{
case 'D':{ x[q]=read();
e[x[q]].del=true; break;
} case 'Q':{ x[q]=read(),k[q]=read();
cnt++; break;
} case 'C':{ x[q]=read(),k[q]=val[x[q]],val[x[q]]=read(); break;
}
}
} for(RI i=1;i<=n;i++)
fa[i]=i,insert(root[i],-INF,INF,val[i],1); for(RI i=1;i<=m;i++)
{
if(e[i].del)continue;
link(e[i].u,e[i].v);
} for(RI i=q;i>=1;i--)
switch(opt[i])
{
case 'D':{ e[x[i]].del=false;
link(e[x[i]].u,e[x[i]].v); break;
} case 'Q':{ int p=get(x[i]); int A=ask(root[p],-INF,INF,k[i]); if(A==-INF||A==INF)
continue; ans+=(long double)A/cnt; break;
} case 'C':{ int p=get(x[i]); insert(root[p],-INF,INF,val[x[i]],-1);
val[x[i]]=k[i];
insert(root[p],-INF,INF,val[x[i]],1); break;
}
} printf("Case %d: %Lf\n",++T,ans);
} int main()
{
while(n=read(),m=read(),n&&m) work(); return 0;
}

\[\text{Thanks} \ \text{for} \ \text{watching}
\]

题解 UVA1479 【Graph and Queries】的更多相关文章

  1. UVA1479 Graph and Queries

    思路 恶心人的题目 还是类似永无乡一题的Treap启发式合并思路 但是由于加边变成了删边 所以应该离线后倒序处理 数组要开够 代码 #include <cstdio> #include & ...

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

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

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

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

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

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

  5. HDU 3726 Graph and Queries treap树

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

  6. 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 ...

  7. CF1416D Graph and Queries

    本题解用于作者加深算法印象,也欢迎各位的阅读. 题目大意 给你一张无向图,并给你两种操作: \(1~v\) :找到当前点 \(v\) 所在的联通块内权值最大的点,输出该点权值并将其权值改为 \(0\) ...

  8. UVALive5031 Graph and Queries(Treap)

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

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

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

随机推荐

  1. js判断各种类型

    js的六种基本类型:Object,Boolean,Number,String,Undefined,Null; Object中又有:Function,Array,Date... 如何判断数据类型? Ob ...

  2. PHP计算每月几周,每周的开始结束日期

    PHP计算每月几周,每周的开始结束日期 因为项目中需要一个每周工作计算的功能,具体日期的算法是,把每月拆分成几个周,最后一个星期这个月份的天数不够就补上下个月的. 列如今天8月27星期一,这个月有31 ...

  3. .NET 在云原生时代的蜕变,让我在云时代脱颖而出

    .NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.有了开源和跨平台这两个关键优先事项,我们就可以放心了.云原生对应用运行时的不同需求,说明一个.NET Core 在云原生时 ...

  4. .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  5. python异常(理论知识)

    异常 程序在运行过程当中,不可避免的会出现一些错误,比如: 使用了没有赋值过的变量 使用了不存在的索引 除0 ... 这些错误在程序中,我们称其为异常. 程序运行过程中,一旦出现异常将会导致程序立即终 ...

  6. canal 基于Mysql数据库增量日志解析

    canal 基于Mysql数据库增量日志解析  1.前言  最近太多事情 工作的事情,以及终身大事等等 耽误更新,由于最近做项目需要同步监听 未来电视 mysql的变更了解到公司会用canal做增量监 ...

  7. 序列积第m小元素 二分答案优化

    给出两个长度为n的数组A和B, 在A和B中各任取一个, 可以得到n×n个积. 求第m小的元素. n<=100000 这一道题的意思就是 a1 a2 a3 a4.. b1 b2 b3 b4 n^2 ...

  8. 「BZOJ4173」数学

    题面 已知 \[\large{S(n,m)=\{k_{1},k_{2},\cdots k_{i}\}}\] 且每个 \(k\) 满足 \[\large{n \%k+m\%k\geq k}\] 求 \[ ...

  9. Vs中提交了代码但是不想推送到Git中

    1:首先就是我fix code 是要提交上去的,所以我就开始提交呢,但是,一看提交后,还没有推送到git就是现在下面的这个状态 上面这个是==> 这是先新增的文件,第一步.但是第一步就差推送了, ...

  10. Django-视图&网址

    前言 Django第一篇简单的介绍了环境搭建与创建Django项目的两种方式,以及如何启动服务,在前端访问HelloWorld地址,这篇内容首先学习一下Django项目中的各个模块的用途及Django ...