线段树每个结点维护5个域:

整个区间的MST。

将两个左端点连通,两个右端点不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块。

将两个右端点连通,两个左端点不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块。

两个左端点不连通,两个右端点也不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块。(就是上面一条线,下面一条线)

两个左端点不连通,两个右端点也不连通,整个区间内选择2*(r-l+1)-3条边的最小生成森林,有3个连通块。

合并时讨论5*5*2(两条夹缝里的横边是否都选择)种情况。

/*每个结点维护5个域:左右完全连通,左连通右不连通,右连通左不连通,左右都不连通2,左右都不连通3*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 60001
#define INF 1000000000
int n,m,heng[2][N],zong[N];
struct Node
{
int z1y1,z1y0,z0y1,z0y02,z0y03;
void reset(){z1y1=z1y0=z0y1=z0y02=z0y03=INF;}
}T[N<<2];
inline void pushup(Node &rt,const Node &ls,const Node &rs,const int &r1,const int &l1,const int &l2)
{
rt.reset(); int MIN=min(heng[0][r1],heng[1][r1]),SUM=heng[0][r1]+heng[1][r1]; /*z1y1+z1y1*/rt.z1y1=ls.z1y1+rs.z1y1+MIN;
if(l2>1)/*z1y1+z1y0*/rt.z1y0=ls.z1y1+rs.z1y0+MIN;
if(l2>1)/*z1y1+z0y1*/rt.z1y1=min(rt.z1y1,ls.z1y1+rs.z0y1+SUM);
/*z1y1+z0y02*/rt.z1y1=min(rt.z1y1,ls.z1y1+rs.z0y02+SUM);
rt.z1y0=min(rt.z1y0,ls.z1y1+rs.z0y02+MIN);
if(l2>1)/*z1y1+z0y03*/rt.z1y0=min(rt.z1y0,ls.z1y1+rs.z0y03+SUM); if(l1>1)/*z1y0+z1y1*/rt.z1y1=min(rt.z1y1,ls.z1y0+rs.z1y1+SUM);
if(l1>1&&l2>1)/*z1y0+z1y0*/rt.z1y0=min(rt.z1y0,ls.z1y0+rs.z1y0+SUM);
/*z1y0+z0y1不合法*/
if(l1>1)/*z1y0+z0y02*/rt.z1y0=min(rt.z1y0,ls.z1y0+rs.z0y02+SUM);
/*z1y0+z0y03不合法*/ if(l1>1)/*z0y1+z1y1*/rt.z0y1=ls.z0y1+rs.z1y1+MIN;
if(l1>1&&l2>1)/*z0y1+z1y0*/rt.z0y03=ls.z0y1+rs.z1y0+MIN;
if(l1>1&&l2>1)/*z0y1+z0y1*/rt.z0y1=min(rt.z0y1,ls.z0y1+rs.z0y1+SUM);
if(l1>1)/*z0y1+z0y02*/rt.z0y1=min(rt.z0y1,ls.z0y1+rs.z0y02+SUM),
rt.z0y03=min(rt.z0y03,ls.z0y1+rs.z0y02+MIN);
if(l1>1&&l2>1)/*z0y1+z0y03*/rt.z0y03=min(rt.z0y03,ls.z0y1+rs.z0y03+SUM); /*z0y02+z1y1*/rt.z1y1=min(rt.z1y1,ls.z0y02+rs.z1y1+SUM);
rt.z0y1=min(rt.z0y1,ls.z0y02+rs.z1y1+MIN);
if(l2>1)/*z0y02+z1y0*/rt.z1y0=min(rt.z1y0,ls.z0y02+rs.z1y0+SUM),
rt.z0y03=min(rt.z0y03,ls.z0y02+rs.z1y0+MIN);
if(l2>1)/*z0y02+z0y1*/rt.z0y1=min(rt.z0y1,ls.z0y02+rs.z0y1+SUM);
/*z0y02+z0y02*/rt.z0y02=ls.z0y02+rs.z0y02+SUM;
rt.z0y03=min(rt.z0y03,ls.z0y02+rs.z0y02+MIN);
if(l2>1)/*z0y02+z0y03*/rt.z0y03=min(rt.z0y03,ls.z0y02+rs.z0y03+SUM); if(l1>1)/*z0y03+z1y1*/rt.z0y1=min(rt.z0y1,ls.z0y03+rs.z1y1+SUM);
if(l1>1&&l2>1)/*z0y03+z1y0*/rt.z0y03=min(rt.z0y03,ls.z0y03+rs.z1y0+SUM);
/*z0y03+z0y1不合法*/
if(l1>1)/*z0y03+z0y02*/rt.z0y03=min(rt.z0y03,ls.z0y03+rs.z0y02+SUM);
/*z0y03+z0y03不合法*/
}
void buildtree(int rt,int l,int r)
{
if(l==r)
{
T[rt].z1y1=zong[l];
return;
}
int m=(l+r>>1);
buildtree(rt<<1,l,m);
buildtree(rt<<1|1,m+1,r);
pushup(T[rt],T[rt<<1],T[rt<<1|1],m,m-l+1,r-m);
}
void update(int p,int v,int rt,int l,int r)
{
if(l==r)
{
zong[p]=v;
T[rt].z1y1=v;
return;
}
int m=(l+r>>1);
if(p<=m) update(p,v,rt<<1,l,m);
else update(p,v,rt<<1|1,m+1,r);
pushup(T[rt],T[rt<<1],T[rt<<1|1],m,m-l+1,r-m);
}
void update(int p,int rt,int l,int r)
{
if(l==r) return;
int m=(l+r>>1);
if(p<=m) update(p,rt<<1,l,m);
else update(p,rt<<1|1,m+1,r);
pushup(T[rt],T[rt<<1],T[rt<<1|1],m,m-l+1,r-m);
}
Node query(int ql,int qr,int rt,int l,int r)
{
if(ql<=l && r<=qr) return T[rt];
int m=(l+r>>1);
if(ql<=m && m<qr)
{
Node res;
pushup(res,query(ql,qr,rt<<1,l,m),query(ql,qr,rt<<1|1,m+1,r),m,m-l+1,r-m);
return res;
}
else if(ql<=m) return query(ql,qr,rt<<1,l,m);
else return query(ql,qr,rt<<1|1,m+1,r);
}
int main()
{
// freopen("bzoj3995.in","r",stdin);
// freopen("bzoj3995.out","w",stdout);
for(int i=1;i<=500000;++i);
scanf("%d%d",&n,&m);
for(int i=0;i<2;++i)
for(int j=1;j<n;++j)
scanf("%d",&heng[i][j]);
for(int i=1;i<=n;++i)
scanf("%d",&zong[i]);
buildtree(1,1,n);
// printf("%d\n",query(1,3,1,1,n).z1y1);
// printf("%d\n",query(1,3,1,1,n).z1y0);
// printf("%d\n",query(1,3,1,1,n).z0y1);
// printf("%d\n",query(1,3,1,1,n).z0y02);
// printf("%d\n",query(1,3,1,1,n).z0y03);
char op[3];
int x1,y1,x2,y2,val;
for(;m;--m)
{
scanf("%s",op);
if(op[0]=='C')
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val);
if(y1==y2) update(y1,val,1,1,n);
else
{
if(y1>y2) swap(y1,y2);
heng[x1-1][y1]=val;
update(y1,1,1,n);
update(y2,1,1,n);
}
}
else
{
scanf("%d%d",&y1,&y2);
printf("%d\n",query(y1,y2,1,1,n).z1y1);
}
}
return 0;
}

【线段树】bzoj3995 [SDOI2015]道路修建的更多相关文章

  1. [bzoj3995] [SDOI2015]道路修建 线段树

    Description 某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L<=R),修建若干条专用道路,使得这两列之间(包括 ...

  2. bzoj3995[SDOI2015]道路修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=3995 线段树维护连通性. 我们发现,对于一个区间[L,R],我们只需要知道(1,L),(2,L),( ...

  3. 【BZOJ3995】[SDOI2015]道路修建 线段树区间合并

    [BZOJ3995][SDOI2015]道路修建 Description  某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L&l ...

  4. [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】

    题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过  1018,即使它在 ProblemSet 的第一页 ...

  5. [SDOI2015]道路修建(线段树)

    题意:给定2行n列的四连通带权网格图,支持修改边权和查询第[l,r]列的最小生成树 题解:这是一道好题,要么SDOI2019中n=2的20pts怎么会“我抄我自己”?(当然NOIP2018“我抄我自己 ...

  6. 【XSY2528】道路建设 LCT 可持久化线段树

    题目描述 给你一个\(n\)个点\(m\)条边图,\(q\)个询问,每次问你边权在\([l,r]\)之间的边组成的最小生成树(森林)的边权和.强制在线. \(n,m,q\leq 100000\) 题解 ...

  7. 【LOJ】#2186. 「SDOI2015」道路修建

    题解 就是线段树维护一下转移矩阵 分成两种情况,一种是前面有两个联通块,一种是前面有一个联通块 从一个联通块转移到一个联通块 也就是新加一列的三个边选其中两条即可 从一个联通块转移到两个联通块 不连竖 ...

  8. 洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树

    https://www.luogu.org/problemnew/show/P2505 https://www.lydsy.com/JudgeOnline/problem.php?id=2750 神奇 ...

  9. 【洛谷P4319】 变化的道路 线段树分治+LCT

    最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...

随机推荐

  1. UGUI&&Animator模块知识点随记

    1.Render Texture,把这个赋给摄像机,这个对象就保存了摄像机拍摄到的纹理,再把他赋给Raw Image. 2.给Button添加事件关联时,函数不能带有yield WaitForSeco ...

  2. 顶点着色器详解 (Vertex Shaders)

    学习了顶点处理,你就知道固定功能流水线怎么将顶点从模型空间坐标系统转化到屏幕空间坐标系统.虽然固定功能流水线也可以通过设置渲染状态和参数来改变最终输出的结果,但是它的整体功能还是受限.当我们想实现一个 ...

  3. oracle 学习笔记2

    1.oracle 中rowid和rownum的区别 oracle 数据库中,每一行都有一个唯一行的标识符,ROWID,数据库内部用来存储行的物理位置.ROWID是一个18位数字,采用base-64编码 ...

  4. CURL详解(转载)

    curl_setop()函数中的参数中文说明 curl_setop()函数中的参数中文说明 curl_setopt()函数将为一个CURL会话设置选项.option参数是你想要的设置,value是这个 ...

  5. windows7内核驱动开发试验环境配置

    首先配置环境参照这个: http://blog.csdn.net/qing666888/article/details/50858272 然后在win10里可能由于没有做测试签名因此一直没有成功加载驱 ...

  6. Oracle数据访问组件ODAC的安装方法:

    Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...

  7. 使用NPOI2.1.3.1版本导出word附带表格和图片

    原文:http://www.cnblogs.com/afutureBoss/p/4074397.html?utm_source=tuicool&utm_medium=referral 最近项目 ...

  8. div水平垂直居中

    我们平时常用的定高,top:50%:left:50%和margin-left负一半宽度margin-top负一半高度的居中方式暂不考虑,因为这种方式大家都会. 第一种绝对定位(absolute cen ...

  9. socket阻塞与非阻塞,同步与异步

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...

  10. java_method_下载导入模版

    //调用方法 upDown.download(request, response, request.getRealPath("")+"/output/BlackNumbe ...