description

有一个n个点A+B条边的无向连通图,有一变量x,每条边的权值都是一个关于x的简单多项式,其中有A条边的权值是k+x,另外B条边的权值是k-x,如果只保留权值形如k+x的边,那么这个图仍是一个连通图,如果只保留权值形如k-x的边,这个图也依然是一个连通图。

给出q组询问,每组询问给出x的值,问此时这个无向连通图的最小生成树权值是多少。


analysis

  • 首先容易知道图任意时候的\(MST\)只由\(A\)集合或\(B\)集合内的边组成

  • 当\(x\)从\(-∞\)逐渐变为\(+∞\),\(MST\)会从只由\(A\)的边构成逐渐变成只由\(B\)的边构成

  • 这里\(MST\)只会变化\(n-1\)次,那么用\(LCT\)维护\(MST\)的添边删边

  • 当然先\(kruskal\)把\(A\)和\(B\)各有用的\(n-1\)条边搞出来,把\(A\)的边塞到\(LCT\)上面

  • 升序排序\(B\)的边一条条加进\(LCT\)里面,然后代替掉新环里\(k\)最大的\(A\)边

  • 用当前\(B\)边的\(k-x\)减去删去该\(A\)边的\(k+x\),会得到\(k'-2x\)一类式子

  • 注意如果查询的环边上有\(B\)边,因为只换掉\(A\)边无视\(B\)边,所以连\(B\)边时不用连边节点

  • 如果有多条\(B\)边,由于升序加入\(LCT\),所以\(k\)更小的\(B\)边会贡献得早

  • 对于最后的求答案,把询问排序,且已经得到\(n-1\)条\(k-2x\)这样的式子

  • 把式子再按\(k\)排序,看每个询问会用到前替换的多少条边(也就是前多少条式子)

  • 扫一遍这堆式子,只要\(k-2*\)当前询问的数\(<=0\),说明替换这条边是有贡献的,继续扫下去

  • 注意答案还要算上每个\(k\)以及剩下还没有被替换的\(A\)边里的\(+x\)


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ha 1926081719491001
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll tr[MAXN][2],fa[MAXN],pf[MAXN],st[MAXN],fat[MAXN],val[MAXN],answer[MAXN];
ll n,m,A,B,q,tot,cnt,ans;
struct quiry{ll x,y;}inquiry[MAXN];
struct edge{ll x,y,z;}f[2][MAXN],g[MAXN];
struct node{ll mx,val,size;bool rev;}a[MAXN];
inline ll read(){ll x=0,f=1;char ch=getchar();while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void swap(ll &x,ll &y){ll z=x;x=y,y=z;}
inline bool cmp(edge a,edge b){return a.z<b.z;}
inline bool cmpp(quiry a,quiry b){return a.x<b.x;}
inline ll getfa(ll x){return !fat[x]?x:fat[x]=getfa(fat[x]);}
inline void update(ll x){if (!x)return;a[x].mx=x;if (a[a[tr[x][0]].mx].val>a[a[x].mx].val)a[x].mx=a[tr[x][0]].mx;if (a[a[tr[x][1]].mx].val>a[a[x].mx].val)a[x].mx=a[tr[x][1]].mx;a[x].size=a[tr[x][0]].size+a[tr[x][1]].size+1;}
inline void reverse(ll x){if (x)swap(tr[x][0],tr[x][1]),a[x].rev^=1;}
inline void down(ll x){if (a[x].rev)reverse(tr[x][0]),reverse(tr[x][1]),a[x].rev=0;}
inline void downdata(ll x){while (x)st[++st[0]]=x,x=fa[x];while (st[0])down(st[st[0]--]);}
inline ll lr(ll x){return tr[fa[x]][1]==x;}
inline void rotate(ll x){ll y=fa[x],k=lr(x);tr[y][k]=tr[x][!k];if (tr[x][!k])fa[tr[x][!k]]=y;fa[x]=fa[y];if (fa[y])tr[fa[y]][lr(y)]=x;tr[x][!k]=y,fa[y]=x,pf[x]=pf[y],update(y),update(x);}
inline void splay(ll x,ll y){downdata(x);while (fa[x]!=y){if (fa[fa[x]]!=y)rotate(lr(fa[x])==lr(x)?fa[x]:x);rotate(x);}}
inline void access(ll x){for (ll y=0;x;update(x),y=x,x=pf[x])splay(x,0),fa[tr[x][1]]=0,pf[tr[x][1]]=x,tr[x][1]=y,fa[y]=x,pf[y]=0;}
inline void makeroot(ll x){access(x),splay(x,0),reverse(x);}
inline void link(ll x,ll y){makeroot(x),pf[x]=y;}
inline void cut(ll x,ll y){makeroot(x),access(y),splay(x,0),tr[x][1]=fa[y]=pf[y]=0,update(x);}
inline ll query(ll x,ll y){makeroot(x),access(y),splay(y,0);return a[y].mx;}
int main()
{
freopen("T3.in","r",stdin);
//freopen("graph.in","r",stdin);
//freopen("graph.out","w",stdout);
n=read(),A=read(),B=read(),q=read();
fo(i,1,A)f[0][i].x=read(),f[0][i].y=read(),f[0][i].z=read();
fo(i,1,B)f[1][i].x=read(),f[1][i].y=read(),f[1][i].z=read();
sort(f[0]+1,f[0]+A+1,cmp),sort(f[1]+1,f[1]+B+1,cmp);
fo(i,0,n)a[i].val=-ha;
fo(i,1,A)
{
ll x=f[0][i].x,y=f[0][i].y,z=f[0][i].z;
if (getfa(x)!=getfa(y))fat[getfa(x)]=getfa(y),ans+=z,
a[n+i].val=z,a[n+i].mx=n+i,link(x,n+i),link(n+i,y);
}
memset(fat,0,sizeof(fat));
fo(i,1,B)
{
ll x=f[1][i].x,y=f[1][i].y,z=f[1][i].z;
if (getfa(x)!=getfa(y))fat[getfa(x)]=getfa(y),g[++tot]=f[1][i];
}
fo(i,1,tot)
{
ll x=g[i].x,y=g[i].y,z=g[i].z,tmp=query(x,y);
if (tmp<=n)continue;
cut(f[0][tmp-n].x,tmp),cut(tmp,f[0][tmp-n].y);
link(x,y),val[++cnt]=z-a[tmp].val;
}
fo(i,1,q)inquiry[i].x=read(),inquiry[i].y=i;
sort(inquiry+1,inquiry+q+1,cmpp),sort(val+1,val+cnt+1);
fo(i,1,q)
{
while (m<tot && val[m+1]<=inquiry[i].x*2)ans+=val[++m];
answer[inquiry[i].y]=ans+inquiry[i].x*(n-m*2-1);
}
fo(i,1,q)printf("%lld\n",answer[i]);
return 0;
}

【JZOJ5433】图的更多相关文章

  1. PHP-生成缩略图和添加水印图-学习笔记

    1.开始 在网站上传图片过程,经常用到缩略图功能.这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图. 2.如何生成缩略图 生成缩略图,关键的是如何计算缩放比率. 这里,我根据 ...

  2. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  3. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  4. iOS开发系列--打造自己的“美图秀秀”

    --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...

  5. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

    Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  6. SQLServer文件收缩-图形化+命令

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 收缩前 图形化演示: 不仅仅可以收缩日记文件,数据库文件也是可以收缩的,只不过日记收缩比 ...

  7. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

  8. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

  9. Twproject Gantt开源甘特图功能扩展

    1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...

随机推荐

  1. python接口自动化(响应对象方法)

    python接口自动化(响应对象方法) 一.encoding作用 获取请求的编码(在不设置响应编码时,响应的信息默认使用的是请求的编码格式):r.encoding 设置响应的编码:r.encoding ...

  2. openssl编译方法

    受不了了,终于编译成功了openssl,写一下编译方法吧 准备: 0:要编译openssl,必不可少的是代码,去下载 https://www.openssl.org/source/ 1:要有一个VS系 ...

  3. Linux 下工作用户及环境

    交叉工具的安装 工具链的编译过程请参考第三部分. 1. 下载交叉工具 2.95.3 下载地址:ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/cro ...

  4. Dubbo管理端工具

    要得到dubbo的管理端工具其实很简单,只需要下面几步: 1.下载源码:我下载的是dubbo-dubbo-2.5.7.zip . 2.使用maven命令编译源码,得到war包: 将下载的dubbo-d ...

  5. Java微服务(Spring-boot+MyBatis+Maven)入门教程

    1,项目创建    新建maven项目,如下图: 选择路径,下一步 输入1和2的内容,点完成 项目创建完毕,结构如下图所示: 填写pom.xml里内容,为了用于打包,3必须选择jar,4和5按图上填写 ...

  6. Burnside引理&Pólya定理

    Burnside's lemma 引例 题目描述 一个由2*2方格组成的正方形,每个格子上可以涂色或不涂色, 问共有多少种本质不同的涂色方案. (若两种方案可通过旋转互相得到,称作本质相同的方案) 解 ...

  7. vue footer点击变色

    <header class="tab_nav"> <div v-for="(item,index) in tabNav" @click=&qu ...

  8. WPS Office for Mac如何修改Word文档文字排列?WPS office修改Word文档文字排列方向教程

    Word文档如何改变文字的排列方向?最新版WPS Office for Mac修复了文字排版相关的细节问题,可以更快捷的进行Word编辑,WPS Office在苹果电脑中如何修改Word文档文字排列方 ...

  9. [JZOJ6355] 【NOIP2019模拟】普 24/100

    题目 题目大意 给你一个序列,对于所有\(k\in [1,n]\),求长度为\(k\)的子序列的最大权值,权值为\(a_1-a_2+a_3-...\pm a_k\) 思考历程 这题显然可以背包对吧-- ...

  10. NX二次开发-UFUN打开二进制STL文件函数UF_STD_open_binary_stl_file

    NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...