传送门

解题思路

  可以离线,然后确定每个边的出现时间,算这个排序即可。然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector> using namespace std;
const int N=100005; inline int rd(){
int x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x;
} int n,tot,ans[N],fa[N<<1],siz[N<<1],num,cnt;
struct Data{
int x,y,op,id;
friend bool operator<(const Data A,const Data B){
if(A.x==B.x && A.y==B.y) return A.id<B.id;
if(A.x==B.x) return A.y<B.y;
return A.x<B.x;
}
}tmp[N],ask[N];
struct Node{
int x,y,t;
Node(int _x=0,int _y=0,int _t=0){
x=_x; y=_y; t=_t;
}
}; inline int id(int x,int y){
return (x-1)*n+y;
}
inline int get(int x){
while(x!=fa[x]) x=fa[x];
return x;
} struct Segment_Tree{
vector<Node> v[N<<2];
vector<Node> Ask[N];
void update(int x,int l,int r,int L,int R,Node now){
if(L<=l && r<=R){
if(now.t) Ask[l].push_back(now);
else v[x].push_back(now);
return ;
}
int mid=(l+r)>>1;
if(L<=mid) update(x<<1,l,mid,L,R,now);
if(mid<R) update(x<<1|1,mid+1,r,L,R,now);
}
void query(int x,int l,int r){
int xx,yy,uu,vv; vector<Node> now;
for(int i=0;i<v[x].size();i++){
xx=v[x][i].x; yy=v[x][i].y;
uu=get(xx); vv=get(yy);
if(uu==vv) continue;
if(siz[uu]<siz[vv]) swap(uu,vv);
siz[uu]+=siz[vv]; fa[vv]=uu;
now.push_back(Node(uu,vv,0));
}
int mid=(l+r)>>1;
if(l==r){
for(int i=0;i<Ask[l].size();i++) {
xx=get(Ask[l][i].x); yy=get(Ask[l][i].y);
ans[Ask[l][i].t]=(xx==yy)?1:0;
}
}
else query(x<<1,l,mid),query(x<<1|1,mid+1,r);
for(int i=0;i<now.size();i++){
xx=now[i].x; yy=now[i].y;
fa[yy]=yy; siz[xx]-=siz[yy];
}
}
}tree; int main(){
n=rd(); int x1,y1,x2,y2,id1,id2; char s[10];
for(int i=1;i<=n*2;i++) fa[i]=i,siz[i]=1;
while(1){
scanf("%s",s+1);
if(s[1]=='E') break; cnt++;
x1=rd(),y1=rd(),x2=rd(),y2=rd();
id1=id(x1,y1); id2=id(x2,y2);
if(id1>id2) swap(id1,id2);
if(s[1]=='A') {
num++; ask[num].id=cnt;
ask[num].x=id1; ask[num].y=id2;
continue;
}
tot++; tmp[tot].id=cnt;
tmp[tot].x=id1; tmp[tot].y=id2;
if(s[1]=='O') tmp[tot].op=0;
else tmp[tot].op=1;
}
sort(tmp+1,tmp+1+tot);
for(int i=1;i<=num;i++)
tree.update(1,1,cnt,ask[i].id,ask[i].id,Node(ask[i].x,ask[i].y,i));
for(int i=1;i<=tot;i++){
if(tmp[i].op==0 && tmp[i+1].x==tmp[i].x && tmp[i+1].y==tmp[i].y)
tree.update(1,1,cnt,tmp[i].id,tmp[i+1].id,Node(tmp[i].x,tmp[i].y,0)),++i;
else tree.update(1,1,cnt,tmp[i].id,cnt,Node(tmp[i].x,tmp[i].y,0));
}
tree.query(1,1,cnt);
for(int i=1;i<=num;i++)
puts(ans[i]?"Y":"N");
return 0;
}

BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)的更多相关文章

  1. BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

  2. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  3. 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Descri ...

  4. BZOJ 1018 [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2247  Solved: 706[Submit ...

  5. [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3795  Solved: 1253 [Sub ...

  6. 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树

    [BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...

  7. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

  8. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...

  9. 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set

    题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...

随机推荐

  1. day33—前端开发的模块化和组件化

    转行学开发,代码100天——2018-04-18 今天是记录前端开发中模块化.组件化的知识.关于何为模块化,何为组件化以及为何要如此,目前还是处于一个只可意会不可言传的理解应用阶段. 当然,这样的存在 ...

  2. redis centos集群搭建和java应用

    1. 首先要ssh免密登录 redis集群,3台虚拟机,6个节点,每台机器2个节点一主一从. 192.168.132.154 c0192.168.132.156 c1192.168.132.155 c ...

  3. python 微服务方案

    介绍 使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力.有些异步框架Tornado.Twisted.Gevent 等就是为了解决性能问题.这些框架在性能上有些 ...

  4. [COCI2017.1]Deda —— 解锁线段树的新玩法

    众所周知,能用线段树做的题一定可以暴力 但考场上也只能想到暴力了,毕竟还是对线段树不熟练. deda 描述 有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下 ...

  5. SEC2- - mysql 的介绍

     一.mysql的背景 前身属于瑞典的一家公司,mysql AB 08年被sun公司收购 09年被oracle公司收购  二.mysql的优点 1. 开源免费成本低 2. 性能高,移植性好 3. 体积 ...

  6. SEC4 - MySQL语法规范

    1.不区分大小写,但是建议关键字大写,表名.列名小写. 2.每条命令最好分号结尾 3.每条命令根据需要,可以进行缩进或者换行 4.注释 单行注释:#注释文字 单行注释:--注释文字 多行注释: /* ...

  7. DbWrench002--建模以及数据正向工程和反向工程的具体操作

    DbWrench--建模以及数据正向工程和反向工程 参考博客:https://my.oschina.net/u/3459265/blog/1611999 一.数据正向工程 在建模工作中画好的表与表之间 ...

  8. Dedecms织梦后台登陆验证码不显示几种解决方法

    Dedecms织梦后台登陆验证码不显示几种解决方法,服务器所造成的验证码不显示问题看这里: 方法一:查看服务器的php版本是否与程序版本兼容(织梦程序PHP版本查看方法:打开www.96net.com ...

  9. Android关于Activity生命周期详解

    子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...

  10. 关于Echarts的使用和遇到的问题

    对于插件工具,感觉按着官方的教程,便可以使用,但是看这个Echarts有点晕乎乎的,还是不能快速的学习啊. 一.在webpack中使用ECharts //通过 npm 获取 echartsnpm in ...