[BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树
介绍一种比较慢的但是好想的做法。
网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦。我的做法也是要用线段树的,不过用法完全不同。
这个东西叫做时间分治线段树。
首先我们建一个\(1..m+1\)的线段树。
很好做出每条边的存在时间的区间是吧,所以我们这段时间存入线段树中。(最后都没有消失的视为\(m+1\)时间消失)记录下每个节点的对应区间的所有边。
然后从上往下扫整个线段树,将该段区间的边用并查集维护连通性。遇到询问就查一下。
回去的时候还有撤掉之前连的边,所以并查集给用只有按秩合并,不带按秩合并。这样并查集一次的操作时间复杂度\(O(\log n)\)。
总时间复杂度\(O(n\log ^2 n)\)。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#define lc o<<1
#define rc o<<1|1
#define REP(i,a,n) for(register int i(a);i<=(n);++i)
#define PER(i,a,n) for(register int i(a);i>=(n);--i)
#define FEC(i,x,y) for(register int i=head[x],y=g[i].to;i;i=g[i].ne,y=g[i].to)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
const int SZ=(1<<21)+1;char ibuf[SZ],*iS,*iT,obuf[SZ+128],*oS=obuf,*oT=obuf+SZ-1;
#ifdef ONLINE_JUDGE
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SZ,stdin),(iS==iT?EOF:*iS++)):*iS++)
#else
#define gc() getchar()
#endif
template<typename I>inline void read(I&x){char c=gc();int f=0;for(;c<'0'||c>'9';c=gc())c=='-'?f=1:0;for(x=0;c>='0'&&c<='9';c=gc())x=(x<<1)+(x<<3)+(c&15);f?x=-x:0;}
template<typename I>inline void read(I*s){char c=gc();for(;c<=' ';c=gc());for(;c>' ';c=gc())*s++=c;*s='\0';}
inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
#define printf(...) (oS>oT&&(flush(),1),oS+=sprintf(oS,__VA_ARGS__))
#define putchar(x) (oS>oT&&(flush(),1),*oS++=(x))
template<typename A,typename B>inline char SMAX(A&a,const B&b){return a<b?a=b,1:0;}
template<typename A,typename B>inline char SMIN(A&a,const B&b){return a>b?a=b,1:0;}
typedef long long ll;typedef unsigned long long ull;typedef std::pair<int,int>pii;
const int N=200000+7;
int n,m,x1,y1,x2,y2,id[3][N],ans[N],ext[N];char opt[7];
int fa[N],siz[N];
inline int Find(int x){return fa[x]==x?x:Find(fa[x]);}
inline void Union(int x,int y){x=Find(x),y=Find(y);if(siz[x]<siz[y])std::swap(x,y);SMAX(siz[x],siz[y]+1);fa[y]=x;}
struct QUE{int opt,x,y,prex,prey,sizx,sizy;}q[N<<1];std::vector<QUE>t[N<<1];
inline void Insert(int o,int L,int R,int l,int r,QUE k){
if(l<=L&&R<=r)return t[o].push_back(k);
int M=(L+R)>>1;if(l<=M)Insert(lc,L,M,l,r,k);if(r>M)Insert(rc,M+1,R,l,r,k);
}
inline void Insert(int o,int L,int R,int x,QUE k){
if(L==R)return t[o].push_back(k);
int M=(L+R)>>1;x<=M?Insert(lc,L,M,x,k):Insert(rc,M+1,R,x,k);
}
inline void Solve(int o,int L,int R){
int len=t[o].size();REP(i,0,len-1)if(t[o][i].opt){const int&x=Find(t[o][i].x),y=Find(t[o][i].y);if(x==y)continue;t[o][i].prex=fa[x],t[o][i].prey=fa[y];t[o][i].sizx=siz[x],t[o][i].sizy=siz[y];Union(x,y);}
if(L==R){REP(i,0,len-1)if(!t[o][i].opt)ans[t[o][i].prex]=Find(t[o][i].x)==Find(t[o][i].y);}
else{int M=(L+R)>>1;Solve(lc,L,M);Solve(rc,M+1,R);}
PER(i,len-1,0)if(t[o][i].opt){const int&x=t[o][i].prex,&y=t[o][i].prey;fa[x]=x,fa[y]=y,siz[x]=t[o][i].sizx,siz[y]=t[o][i].sizy;}//错误笔记:和第44行一样,这里的prex啥的应该存下来其find的信息不是自己的信息
}
std::map<pii,int>mp;
int main(){
read(n);REP(i,1,n)id[1][i]=i,id[2][i]=n+i,fa[i]=i,fa[n+i]=n+i,siz[i]=siz[n+i]=1;n<<1;//错误笔记:并查集要记得初始化
REP(i,1,N){
read(opt);if(*opt=='E'){m=i-1;break;}
read(x1),read(y1),read(x2),read(y2);q[i]=QUE{(int)*opt,id[x1][y1],id[x2][y2]};
}
REP(i,1,m){
int opt=q[i].opt,id1=q[i].x,id2=q[i].y;
if(opt=='O')mp[pii(id1,id2)]=i;
else if(opt=='C'){
pii e(id1,id2);
Insert(1,1,m+1,mp[e],i,QUE{1,id1,id2});mp.erase(e);
}else if(opt=='A')Insert(1,1,m+1,i,QUE{0,id1,id2,++ans[0]});
}
std::map<pii,int>::iterator p=mp.begin();
while(p!=mp.end()){Insert(1,1,m+1,p->second,m+1,QUE{1,p->first.first,p->first.second});++p;}
Solve(1,1,m+1);
REP(i,1,ans[0])putchar(ans[i]?'Y':'N'),putchar('\n');
return flush(),0;
}
[BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树的更多相关文章
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- BZOJ1018 [SHOI2008]堵塞的交通traffic
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic
线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...
- Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
随机推荐
- 关于KindEditor编辑器,word文档中的图文全选粘贴,在编辑器中不显示图片的问题
图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...
- CF576D Flights for Regular Customers 矩阵乘法 + Bitset优化
%%%cxhscst2's blog Codeforces 576D Flights for Regular Customers(矩阵加速DP) 代码非常优美 + 简洁,学习到了 Code: #inc ...
- ASP汉字转拼音函数的方法
<% 'ASP汉字转拼音函数 Set d = CreateObject("Scripting.Dictionary") d.add "a",-20319 ...
- UE4 命令行打开工程
创建快捷方式,目标填写: D:\EpicGames\4.14\Engine\Binaries\Win64\UE4Editor.exe "D:\YourProjectPath\YouProje ...
- Web 开发中很实用的效果【源码下载】
网页特效下载 引用地址:http://www.yyyweb.com/350.html 超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应 ...
- [NOIP2016]蚯蚓 题解
题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」= [3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. ...
- (转)CentOS7下解决ifconfig command not found的办法
转:https://blog.csdn.net/ryu2003/article/details/78492127 注:本办法仅限于可联网的机器,即在安装时设置了IP地址和DNS可正常上网. 解决办法如 ...
- mysql - 标识列
#标识列 /* 又称为自增长列 含义:可以不用手动插入值,系统提供默认的序列值 特点: 1.表示列必须和主键搭配吗?不一定,但是要求是一个key 2.一个表中只能有一个标识列! 3.标识列的类型有限制 ...
- DataContract] [DataMember] 程序集引用
引用,右键->添加引用->System.Runtime.Serialization 添加
- PHP中的九大缓存技术
1.全页面静态化缓存也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程.此种方式,在CMS系统中比较常见,比如dedecms: 一种比较常用的实现方式 ...