题目链接

线段树分治+LCT只有80

然后就有了CDQ分治的做法

把不可能在生成树里的扔到后面

把一定在生成树里的扔到并查集里存起来

分治到l=r,修改边权,跑个kruskal就行了

由于要支持撤销,并查集要按秩合并

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std; const int MAXN=2e4+5;
const int MAXM=5e4+5;
const int INF=1e9; int n,m,q,t,ct,p;
int f[MAXN],mxdp[MAXN];
long long sum;
long long ans[MAXM];
bool vis[MAXM];
int v[MAXM];
struct rpg{
int ls,nx,ln,id,kd;
}a[MAXM],st[MAXM];
struct vx{
int id,val;
}w[MAXM];
struct fx{
int x,fx,kd;
}stk[MAXM]; int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
} int find(int x){return f[x]==x?x:find(f[x]);} bool cmp1(rpg a,rpg b){return a.ln<b.ln;}
bool cmp2(rpg a,rpg b){return a.kd<b.kd;}
void un(int fa,int fb)
{
if(mxdp[fa]>mxdp[fb]) swap(fa,fb);
if(mxdp[fa]==mxdp[fb]) stk[++ct]=(fx){fa,fb,1},++mxdp[fb];
else stk[++ct]=(fx){fa,fb,0};
f[fa]=fb;
} long long calc(int d,int t2)
{
for(int i=1;i<=t;++i){
if(a[i].id==w[d].id){
st[w[d].id].ln=a[i].ln=w[d].val;
break;
}
}sort(a+1,a+t+1,cmp1);
long long s=0;
for(int i=1;i<=t;++i){
int fa=find(a[i].ls),fb=find(a[i].nx);
if(fa!=fb) un(fa,fb),s+=a[i].ln;
}while(ct>t2){
if(stk[ct].kd) --mxdp[stk[ct].fx];
f[stk[ct].x]=stk[ct].x;
--ct;
}return sum+s;
} void C(int t2)
{
for(int i=1;i<=t;++i) if(vis[a[i].id]) a[i].ln=INF;
sort(a+1,a+t+1,cmp1);
for(int i=1;i<=t&&a[i].ln<INF;++i){
int fa=find(a[i].ls),fb=find(a[i].nx);
if(fa!=fb) un(fa,fb);
else a[i].kd=2;
}sort(a+1,a+t+1,cmp2);
while(t&&a[t].kd) --t;
while(ct>t2){
if(stk[ct].kd) --mxdp[stk[ct].fx];
f[stk[ct].x]=stk[ct].x;
--ct;
}return;
} void D(int t2)
{
for(int i=1;i<=t;++i) if(vis[a[i].id]) a[i].ln=-INF;
sort(a+1,a+t+1,cmp1);
for(int i=1;i<=t;++i){
int fa=find(a[i].ls),fb=find(a[i].nx);
if(fa!=fb){
un(fa,fb);
if(a[i].ln>-INF) a[i].kd=1,sum+=a[i].ln;
}
}sort(a+1,a+t+1,cmp2);
while(t&&a[t].kd) --t;
while(ct>t2){
if(stk[ct].kd) --mxdp[stk[ct].fx];
f[stk[ct].x]=stk[ct].x;
--ct;
}return;
} void reD(int t2)
{
while(ct>t2){
if(stk[ct].kd) --mxdp[stk[ct].fx];
f[stk[ct].x]=stk[ct].x;
--ct;
}return;
} void reC(int t1)
{
for(int i=t+1;i<=t1;++i){
if(a[i].kd==1) sum-=a[i].ln;
a[i].kd=0;
}t=t1;
return;
} void CDQ(int l,int r)
{
if(l==r){ans[l]=calc(l,ct);return;}
int ctp=t,cmd=ct,mid=l+r>>1;
for(int i=1;i<=t;++i) vis[a[i].id]=0;
for(int i=l;i<=r;++i) vis[w[i].id]=1;
C(cmd),D(cmd);
for(int i=t+1;i<=ctp;++i) if(a[i].kd==1) un(find(a[i].ls),find(a[i].nx));
for(int i=1;i<=t;++i) a[i].ln=st[a[i].id].ln;
CDQ(l,mid),CDQ(mid+1,r);
reC(ctp);reD(cmd);
return;
} int main()
{
n=read(),t=m=read(),q=read();
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1;i<=m;++i) a[i].ls=read(),a[i].nx=read(),a[i].ln=read(),a[i].id=i,st[i]=a[i];
for(int i=1;i<=q;++i) w[i].id=read(),w[i].val=read();
CDQ(1,q);for(int i=1;i<=q;++i) printf("%lld\n",ans[i]);
return 0;
}

【CDQ分治】[HNOI2010]城市建设的更多相关文章

  1. 【BZOJ2001】[HNOI2010]城市建设(CDQ分治,线段树分治)

    [BZOJ2001][HNOI2010]城市建设(CDQ分治,线段树分治) 题面 BZOJ 洛谷 题解 好神仙啊这题.原来想做一直不会做(然而YCB神仙早就切了),今天来怒写一发. 很明显这个玩意换种 ...

  2. [HNOI2010]城市建设

    [HNOI2010]城市建设 玄学cdq O(nlog^2n)的动态最小生成树 其实就是按照时间cdq分治+剪枝(剪掉一定出现和不可能出现的边) 处理[l,r]之间的修改以及修改之后的询问,不能确定是 ...

  3. 【LG3206】[HNOI2010]城市建设

    [LG3206][HNOI2010]城市建设 题面 洛谷 题解 有一种又好想.码得又舒服的做法叫线段树分治+\(LCT\) 但是因为常数过大,无法跑过此题. 所以这里主要介绍另外一种玄学\(cdq\) ...

  4. Luogu 3206 [HNOI2010]城市建设

    BZOJ 2001 很神仙的cdq分治 先放论文的链接   顾昱洲_浅谈一类分治算法 我们考虑分治询问,用$solve(l, r)$表示询问编号在$[l, r]$时的情况,那么当$l == r$的时候 ...

  5. 洛谷P3206 [HNOI2010]城市建设

    神仙题 题目大意: 有一张\(n\)个点\(m\)条边的无向联通图,每次修改一条边的边权,问每次修改之后这张图的最小生成树权值和 话说是不是\(cdq\)题目都可以用什么数据结构莽过去啊-- 这道题目 ...

  6. BZOJ2001 HNOI2010城市建设(线段树分治+LCT)

    一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST.理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗.正解写不动了. #include<iostream> ...

  7. P3206 [HNOI2010]城市建设 [线段树分治+LCT维护动态MST]

    Problem 这题呢 就边权会在某一时刻变掉-众所周知LCT不支持删边的qwq- 所以考虑线段树分治- 直接码一发 如果 R+1 这个时间修改 那就当做 [L,R] 插入了一条边- 然后删的边和加的 ...

  8. BZOJ2001 HNOI2010 城市建设

    题目大意:动态最小生成树,可以离线,每次修改后回答,点数20000,边和修改都是50000. 顾昱洲是真的神:顾昱洲_浅谈一类分治算法 链接: https://pan.baidu.com/s/1c2l ...

  9. [HNOI2010] 城市建设_动态最小生成树(Dynamic_MST)

    这个题...暴力单次修改\(O(n)\),爆炸... $ $ 不过好在可以离线做 如果可以在 分治询问 的时候把图缩小的话就可以做了 硬着头皮把这个骚东西看完了 $ $ 动态最小生成树 然后,就把它当 ...

随机推荐

  1. linux下mysql的远程访问

    安装了虚拟机centos,安装mysql后,在win7下无法用工具访问mysql.提示连接失败. 1.授权远程访问. GRANT ALL PRIVILEGES ON databasename.* TO ...

  2. mongodb postgresql mysql jsonb对比

    mongodb pg mysql jsonb对比 http://erthalion.info/2017/12/21/advanced-json-benchmarks/ 使用禁用jsonb列的压缩 AL ...

  3. windows下docker的安装及常用命令学习

    docker search 镜像名 本文主要介绍Docker在Windows下的安装.关于Docker的介绍和文档在其官网中可以找到:http://www.docker.com .安装环境:Windo ...

  4. 阿里云RDS数据库备份文件恢复到本地数据库

    参考这里:https://help.aliyun.com/knowledge_detail/41817.html 第4.2步要多注释掉一些(应该根据实际报错来注释): [mysqld] innodb_ ...

  5. django admin编辑被外键关联的主表时支持显示字表记录

    假设有模型 class A(models.Model): name = models.CharField() class B(models.Model): name = models.CharFiel ...

  6. Celery启动Django项目:Client sent AUTH, but no password is set 错误处理

    celery -A CeleryTest worker -l info [2017-02-22 07:26:52,666: ERROR/MainProcess] consumer: Cannot co ...

  7. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

  8. Java reflect 反射学习笔记

    1. class 类的使用 万事万物皆对象 (基本数据类型, 静态成员不是面向对象), 所以我们创建的每一个类都是对象, 即类本身是java.lang.Class类的实例对象, 但是这些对象不需要 n ...

  9. Maven <Profiles>定义不同环境的参数变量

    记录一下 https://blog.csdn.net/qq245282209/article/details/52192115

  10. spring boot 自动更新静态文件和后台代码 -- 热部署

    在spring boot使用的过程中, 发现我修改了静态文件, 前台刷新后, 没有任何变化, 必须重新启动, 才能看到, 这简直不能让人接受. 那有什么方法来解决这个问题呢. Baidu之后, 得到了 ...