bzoj3995[SDOI2015]道路修建
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]道路修建的更多相关文章
- 【线段树】bzoj3995 [SDOI2015]道路修建
线段树每个结点维护5个域: 整个区间的MST. 将两个左端点连通,两个右端点不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块. 将两个右端点连通,两个左端点不连通,整个区间 ...
- [bzoj3995] [SDOI2015]道路修建 线段树
Description 某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L<=R),修建若干条专用道路,使得这两列之间(包括 ...
- 【BZOJ3995】[SDOI2015]道路修建 线段树区间合并
[BZOJ3995][SDOI2015]道路修建 Description 某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L&l ...
- [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
- [SDOI2015]道路修建(线段树)
题意:给定2行n列的四连通带权网格图,支持修改边权和查询第[l,r]列的最小生成树 题解:这是一道好题,要么SDOI2019中n=2的20pts怎么会“我抄我自己”?(当然NOIP2018“我抄我自己 ...
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Statu ...
- 【bzoj2435】[NOI2011]道路修建
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...
- 【NOI2011】道路修建 BFS
[NOI2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建 ...
- 【BZOJ】2435: [Noi2011]道路修建(树形dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2435 我怎么感觉那么水.. 坑的是,dfs会爆...好吧..用bfs.. //upd:我的智商也是醉 ...
随机推荐
- Android ImageView
如上图,drawable中不只是可以放bitmap 还可以定制不同形状 <?xml version="1.0" encoding="utf-8"? ...
- ASCII码表及键盘码表。
ASCII码表 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ...
- Mybatis插入语句useGeneratedKeys="true"的用法
<!-- 插入新的问题件 --> <!-- useGeneratedKeys="true"把新增加的主键赋值到自己定义的keyProperty(id)中 --&g ...
- Python第一课
一.模块的常用方法 __name__ #主模块name值main __file__ #文件所在的路径+文件名 __doc__ #文件级别的注释 二.函数 参数 参数默认值 可变参数 ...
- 【转】app瘦身
iPhone经过这几年的发展,已经发生了很大的变化,例如屏幕变得更加多样,尺寸更多,内存变得更大,CPU的架构也在变化.伴随着iPhone的变化,iOS也在变化,例如AutoLayout.size c ...
- Java学习之路(一)了解Java
Java“白皮书”的关键术语 1)简单性 相对于C++:没有头文件.指针运算.结构.联合.操作符重载.虚基类. 另一方面是小:java微型版(Java Micro Edition)用于嵌入式设备 2) ...
- CDN的全称是Content Delivery Network,即内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络 http://baike.baidu.com/link?url=Wd-IGGgslfJemdpuT3Y0BUi88RPQ ...
- CentOS目录结构详解
CentOS是文件管理系统,在CentOS中所有的程序都以文件形式存储.初学CentOS的朋友需要了解各个挂载点 目录的结构和作用.这样才能更好的去管理系统. CentOS的目录大体上可分为四类:管理 ...
- office - 连接字符串.
Microsoft ACE OLEDB 12.0 Connect to Excel 2007 (and later) files with the Xlsx file extension. That ...
- Nginx配置域名转发实例
域名:cps.45wan.com 所在阿里云主机:123.35.9.12 45wan没有在阿里云备案 67wan已经在阿里云备案 阿里云主机(假如123.35.9.12)上原来的nginx配置: ...