显然资源集合处就是树的重心,这题需要动态维护树的重心。

每个连通块以重心为根,用link-cut tree维护每个点的子树大小以及子树内所有点到它的距离和。

合并两个连通块时,考虑启发式合并,暴力往大的树中添加叶子。

添加叶子时,需要将叶子到重心路径上所有点的子树大小+1,距离和则加上一个等差数列。

并且新的重心是可能是原来的重心或者原来重心到叶子路径上的第一个点,暴力即可。

时间复杂度$O(n\log^2n)$。

 

#include<cstdio>
#define N 40010
int n,m,i,x,y,ans;char op[5];
int g[N],v[N<<1],nxt[N<<1],ed,f[N],son[N][2],val[N],tag[N],sum[N],ts[N],td[N],size[N],tmp[N];
inline void swap(int&a,int&b){int c=a;a=b;b=c;}
inline bool isroot(int x){return !f[x]||son[f[x]][0]!=x&&son[f[x]][1]!=x;}
inline void add1(int x,int p){if(!x)return;val[x]+=p;tag[x]+=p;}
inline void add2(int x,int s,int d){if(!x)return;sum[x]+=s+size[son[x][1]]*d;ts[x]+=s;td[x]+=d;}
inline void pb(int x){if(tag[x]){add1(son[x][0],tag[x]);add1(son[x][1],tag[x]);tag[x]=0;}if(td[x]){add2(son[x][0],ts[x]+(size[son[x][1]]+1)*td[x],td[x]);add2(son[x][1],ts[x],td[x]);ts[x]=td[x]=0;}
}
inline void up(int x){size[x]=size[son[x][0]]+size[son[x][1]]+1;}
inline void rotate(int x){int y=f[x],w=son[y][1]==x;son[y][w]=son[x][w^1];if(son[x][w^1])f[son[x][w^1]]=y;if(f[y]){int z=f[y];if(son[z][0]==y)son[z][0]=x;else if(son[z][1]==y)son[z][1]=x;}f[x]=f[y];f[y]=x;son[x][w^1]=y;up(y);
}
inline void splay(int x){int s=1,i=x,y;tmp[1]=i;while(!isroot(i))tmp[++s]=i=f[i];while(s)pb(tmp[s--]);while(!isroot(x)){y=f[x];if(!isroot(y)){if((son[f[y]][0]==y)^(son[y][0]==x))rotate(x);else rotate(y);}rotate(x);}up(x);
}
inline void access(int x){for(int y=0;x;y=x,x=f[x])splay(x),son[x][1]=y,up(x);}
inline int root(int x){access(x);splay(x);while(son[x][0])x=son[x][0];return x;}
inline void addleaf(int x,int y){f[y]=x,son[y][0]=son[y][1]=val[y]=tag[y]=sum[y]=ts[y]=td[y]=0,size[y]=1;x=root(x),access(y),splay(x),add1(x,1),add2(x,0,1);for(y=son[x][1];son[y][0];y=son[y][0]);splay(y);int vx=val[x],vy=val[y];if(vy*2>vx){val[y]=vx,val[x]-=vy;sum[x]-=sum[y]+vy,sum[y]+=sum[x]+vx-vy;access(y),splay(x),son[x][0]=y,son[x][1]=0;}
}
void dfs(int x,int y){addleaf(y,x);for(int i=g[x];i;i=nxt[i])if(v[i]!=y)dfs(v[i],x);
}
inline void addedge(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void link(int x,int y){int X=root(x),Y=root(y);ans-=sum[X]+sum[Y];if(val[X]<val[Y])swap(x,y);dfs(y,x),addedge(x,y),addedge(y,x);ans+=sum[root(x)];
}
int main(){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)val[i]=size[i]=1;while(m--){scanf("%s",op);if(op[0]=='A')scanf("%d%d",&x,&y),link(x,y);if(op[0]=='Q')printf("%d\n",ans);}return 0;
}

  

BZOJ2888 : 资源运输相关推荐

  1. 【BZOJ-2888】资源运输 LCT + 启发式合并

    2888: 资源运输 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 63  Solved: 33 [Submit][Status][Discuss] ...

  2. 物流运输系统设计浅谈

    本文为PMCAFF专栏作者 钟翼翔 于社区发布 随着物流行业的快速发展,作为支撑物流数字化管理.信息化运作的各类系统平台也正层出叠见.运输作为物流作业中费用占比最高的环节之一,其系统竞争也格外激烈,这 ...

  3. 《江南百景图》,解谜经营背后的逻辑

    <江南百景图>是一款椰岛游戏出品的模拟经营类手游,游戏中,玩家将梦回明朝江南地区,成为城市的设计师,描绘蓝图.兴造建筑.规划布局,经营赚钱:另外还有奇遇探险等多条支线,安排居民起居工作,玩 ...

  4. 《山谷物语》要怎么成为Supercell下一款年收入10亿美元的产品?

    前不久,Supercell公开了半年内的第5款新品.模拟经营类新作<山谷物语>.这不止是他们近几年内的第一个新IP,也是Supercell的又一款"种田"游戏,Supe ...

  5. 【渝粤题库】广东开放大学 应急管理 形成性考核

    选择题 题目:()是突发公共事件应急管理工作的最高行政领导机构. 题目:以下突发公共事件中,属于公共安全事件的是()? 题目:我们赖以生活的价值是天生的,包括真.善.美在内的人类的古老价值,以及后来的 ...

  6. 百度云BaaS体系揭秘,突破共识机制、单机计算和串行处理三大瓶颈

    区块链作为去中心化的技术机制拥有广泛的应用场景与市场潜能.自2017年爆发式增长后,区块链虽然已经进入平稳期,但仍然存在概念混淆.技术性能制约.智能合约制约.共识机制.网络建设等痛点.为了打破行业壁垒 ...

  7. 【docker】虚拟化和docker容器概念

    基础了解 IAAS: 基础设施服务,(只提供基础设施,没有系统) **SAAS: ** 软件即服务,(提供基础设施和系统) PAAS: 平台即服务,(提供基础设施和系统和软件一个整体平台,拿来用就行) ...

  8. docker:虚拟化和docker容器概念

    目录 前言 一.虚拟化简介 1.虚拟化概述 2.耦合与解耦合 2.1 耦合 2.2 解耦合 2.3 小结 3.虚拟化作用 4.虚拟化工作原理 4.1 QEMU 4.2 KVM 4.3 虚拟化类型 4. ...

  9. 新能源汽车行业资讯-2022-9-17

    1.解决知识产权问题,<汽车行业标准必要专利许可指引>全文发布 2.新能源汽车的电驱动系统里,最核心的技术是什么? 3.东风商用车交付纯电中重卡超2000辆 加速掌握新能源关键核心技术 4 ...

最新文章

  1. Oracle创建表空间(转)
  2. c语言 字符相加_C语言中自加自减的编译原理
  3. 为SAP Spartacus安装后台必须的Commerce Cloud
  4. GlassFish 4带来了Java EE 7
  5. Python进阶-函数默认参数,特别是参数传递为空列表
  6. JA-SIG(CAS)学习笔记1
  7. 【Kafka】Flink kafka TimeoutException Timeout expired while fetching topic metadata
  8. .netframewor划时代的系统:纪念Vista发布5周年
  9. xml转java代码_java 中xml转换为Bean实例解析(纯代码)
  10. 1、Spring入门
  11. elastic-job 新手指南
  12. android studio systrace,Android Systrace 基础知识 -- Systrace 简介
  13. 计算机科学和热力学,相图热力学数据库及其计算软件: 过去、现在和将来
  14. Linux 安装 rar 解压
  15. 计算机控制独立点火结构图,独立点火线圈检测方法 独立点火线圈结构线路图...
  16. GitHub下载神器,GitHub开元神器
  17. java 修改exif_照片EXIF信息的读取和改写的JAVA实现
  18. 服务——DNS正向反向域名解析服务
  19. 8路开关量输入采集远程控制继电器模块的功能及应用
  20. vc添加任务栏托盘图标

热门文章

  1. boost库在工作(20)线程之五
  2. 用java调用oracle存储过程总结一
  3. hdu1556 线段树段更新(简单题)
  4. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
  5. 【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )
  6. 【SeeMusic】音符方块颜色设置 ( 单一颜色设置 | 多彩音符设置 | 定时变色设置 | 渐变颜色 | 分轨道提示 )
  7. 【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )
  8. 前端基础:web语义化
  9. 用 Python 实现文件查找
  10. Django ORM 级联删除