http://www.lydsy.com/JudgeOnline/problem.php?id=3995

线段树维护连通性。

我们发现,对于一个区间[L,R],我们只需要知道(1,L),(2,L),(1,R)和(2,R)这4个点的之间的连通情况即可。

我们在线段树中,假设当前节点的表示的区间的为[L,R],我们需要知道(1,L),(2,L),(1,R)和(2,R)这4个点的之间的连通情况,但是为了方便,我们记了(1,L),(2,L),(1,R+1)和(2,R+1)这4个点的连通情况。

每个节点记住5种连通情况:

1:

2:

3:

4:

5:

这样分类的好处是合并的时候比较简单。

合并的时候只有17种是合法的,一一打表即可。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define p_b(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int INF=0x3f3f3f3f; int N,Q;
int A[maxN+][]; struct Tnode
{
int X[];
int& operator [](int i){return X[i];}
}; const int magic[][]=
{
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
{,,},
}; Tnode operator +(Tnode L,Tnode R)
{
int i;Tnode res;
mmst(res.X,0x3f);
re(i,,-)upmin(res[magic[i][]],L[magic[i][]]+R[magic[i][]]);
return res;
} Tnode T[*maxN+]; Tnode calc(int s)
{
Tnode res;
res[]=A[s][]+A[s][];
res[]=A[s][]+A[s][]+A[s][]+A[s+][]-max(max(A[s][],A[s][]),max(A[s][],A[s+][]));
res[]=A[s+][]+min(A[s][],A[s][]);
res[]=A[s][]+min(A[s][],A[s][]);
res[]=min(A[s][],A[s][]);
return res;
} void build(int rt,int l,int r)
{
if(l==r){T[rt]=calc(l);return;}
int mid=(l+r)>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
T[rt]=T[rt<<]+T[rt<<|];
} void change(int rt,int l,int r,int x)
{
if(l==r){T[rt]=calc(l);return;}
int mid=(l+r)>>;
if(x<=mid) change(rt<<,l,mid,x); else change(rt<<|,mid+,r,x);
T[rt]=T[rt<<]+T[rt<<|];
} Tnode ask(int rt,int l,int r,int x,int y)
{
if(x<=l && r<=y) return T[rt];
int mid=(l+r)>>;
if(y<=mid) return ask(rt<<,l,mid,x,y);
if(mid+<=x) return ask(rt<<|,mid+,r,x,y);
return ask(rt<<,l,mid,x,y)+ask(rt<<|,mid+,r,x,y);
} int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
int i;
N=gint();Q=gint();
re(i,,N-)A[i][]=gint();
re(i,,N-)A[i][]=gint();
re(i,,N)A[i][]=gint();
build(,,N-);
while(Q--)
{
char type=getchar();while(type!='C' && type!='Q')type=getchar();
if(type=='C')
{
int x0=gint(),y0=gint(),x1=gint(),y1=gint(),w=gint();
if(x0==x1)
{
A[min(y0,y1)][x0]=w;
change(,,N-,min(y0,y1));
}
else
{
A[y0][]=w;
if(y0!=)change(,,N-,y0-);
if(y0!=N)change(,,N-,y0);
}
}
else
{
int l=gint(),r=gint();
if(l==r)
PF("%d\n",A[l][]);
else
{
Tnode ans=ask(,,N-,l,r-);
PF("%d\n",ans[]);
}
}
}
return ;
}

bzoj3995[SDOI2015]道路修建的更多相关文章

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

    线段树每个结点维护5个域: 整个区间的MST. 将两个左端点连通,两个右端点不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块. 将两个右端点连通,两个左端点不连通,整个区间 ...

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

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

  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. 【BZOJ-2435】道路修建 (树形DP?)DFS

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3115  Solved: 1002[Submit][Statu ...

  7. 【bzoj2435】[NOI2011]道路修建

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...

  8. 【NOI2011】道路修建 BFS

    [NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...

  9. 【BZOJ】2435: [Noi2011]道路修建(树形dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...

随机推荐

  1. YKCW6-BPFPF-BT8C9-7DCTH-QXGWCYQ7PR-QTHDM-HCBCV-9GKGG-TB2TM

    YKCW6-BPFPF-BT8C9-7DCTH-QXGWCYQ7PR-QTHDM-HCBCV-9GKGG-TB2TM

  2. [Redux] Composition with Objects

    For example, current we have those todos: { todos: [ { completed: true, id: 0, text: "Learn Red ...

  3. Laravel 加载 js css image 文件

    写在前面的话: 1.前提是需要使用blade模板引擎 2.css js image 文件夹建在laravel 的 public 目录下面 3.生成的路径默认都是相对路径 A: 加载css文件 (用下面 ...

  4. poj 2823 Sliding Window(单调队列)

    /* 裸地单调队列.. 第一次写 写的好丑.... */ #include<iostream> #include<cstdio> #include<cstring> ...

  5. 如何使用css、布局横向导航栏

    使用css布局横向导航栏,css应用给网页样式的方式,就相当于,给人怎么去穿上衣服,不同的衣服有不同的穿法,这里我们使用的是内联式.在这里 我们可以适当的把值调的大一点,这样我们就可以很容易的对比. ...

  6. java沙箱机制原理

    参考文档如下: http://www.2cto.com/kf/201012/79578.html

  7. FileUpload 简单上传+小预览

    页面代码 : <form id="form1" runat="server"> <div> <asp:FileUpload ID= ...

  8. sql 判断表、列、视图等是否存在

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名')     drop database [数据库名] 2 判 ...

  9. 怎样成为PHP 方向的一个合格的架构师

    突然看到这篇文章, 值得反省, 乐在其中, 在接下来的发展中不被淘汰的都来看看, 如何成为一个架构师先明确这里所指的PHP工程师,是指主要以PHP进行Web系统的开发,没有使用其的语言工作过.工作经验 ...

  10. Android Studio Gradle 版本不同报错解决方法

    由于GFW的原因,我们在使用as时经常出现失败,或者第一次新建工程不成功. 很多博客上已经提到了如何解决第一次新建工程Gradle构建的问题,那么在打开别的工程时依旧会报错 "Failed ...