动态图的连通性当然是可以用LCT维护的。但这相当的不优美,毕竟这样做没有用到任何该图的性质,LCT自带的大常数也会使其跑得非常慢。

  考虑用线段树维护区间左右端四个点之间各自的连通性(仅经过该区间内路径)。查询时考虑几种绕来绕去的情况。

  剩下的是大讨论。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
int n;
bool r[N][];
struct data{int L,R;bool f[],w[];//0 u 1 d 2 l 3 r 4 z 5 f
}tree[N<<];
int whichop(int x,int y,int u,int v)
{
if (y==v) return ;
if (x==u) return x;
return x==?:;
}
void build(int k,int l,int r)
{
tree[k].L=l,tree[k].R=r;
if (l==r) {tree[k].f[]=tree[k].f[]=;return;}
else tree[k].w[]=tree[k].w[]=;
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
data merge(data x,data y)
{
data v;v.L=x.L,v.R=y.R;
v.w[]=x.w[]||y.w[]||!r[x.R][];
v.w[]=x.w[]||y.w[]||!r[x.R][];
v.f[]=x.f[]&&y.f[]&&r[x.R][]||x.f[]&&y.f[]&&r[x.R][];
v.f[]=x.f[]&&y.f[]&&r[x.R][]||x.f[]&&y.f[]&&r[x.R][];
v.f[]=x.f[]||x.f[]&&r[x.R][]&&r[x.R][]&&y.f[];
v.f[]=y.f[]||y.f[]&&r[x.R][]&&r[x.R][]&&x.f[];
v.f[]=x.f[]&&r[x.R][]&&y.f[]||x.f[]&&r[x.R][]&&y.f[];
v.f[]=x.f[]&&r[x.R][]&&y.f[]||x.f[]&&r[x.R][]&&y.f[];
return v;
}
void modifyrow(int k,int x)
{
if (tree[k].L==tree[k].R) return;
if (tree[k].L+==tree[k].R) {tree[k]=merge(tree[k<<],tree[k<<|]);return;}
int mid=tree[k].L+tree[k].R>>;
if (x<mid) modifyrow(k<<,x);
else if (x>mid) modifyrow(k<<|,x);
tree[k]=merge(tree[k<<],tree[k<<|]);
}
void modifyline(int k,int x,int op)
{
if (tree[k].L==tree[k].R)
{
tree[k].f[]=tree[k].f[]=;
tree[k].f[]=tree[k].f[]=tree[k].f[]=tree[k].f[]=op;
return;
}
int mid=tree[k].L+tree[k].R>>;
if (x<=mid) modifyline(k<<,x,op);
else modifyline(k<<|,x,op);
tree[k]=merge(tree[k<<],tree[k<<|]);
}
data query(int k,int l,int r)
{
if (tree[k].L==l&&tree[k].R==r) return tree[k];
int mid=tree[k].L+tree[k].R>>;
if (r<=mid) return query(k<<,l,r);
else if (l>mid) return query(k<<|,l,r);
else return merge(query(k<<,l,mid),query(k<<|,mid+,r));
}
bool isempty(int k,int L,int R,int x)
{
if (tree[k].L==L&&tree[k].R==R) return !tree[k].w[x];
int mid=tree[k].L+tree[k].R>>;
if (R<=mid) return isempty(k<<,L,R,x);
else if (L>mid) return isempty(k<<|,L,R,x);
else return r[tree[k<<].R][x]&&isempty(k<<,L,mid,x)&&isempty(k<<|,mid+,R,x);
}
int queryleft(int k,int p,int x)
{
if (tree[k].L==tree[k].R) return tree[k].L;
int mid=tree[k].L+tree[k].R>>;
if (p<=mid) return queryleft(k<<,p,x);
else return isempty(k<<|,tree[k<<|].L,p,x)&&r[tree[k<<].R][x]?queryleft(k<<,tree[k<<].R,x):queryleft(k<<|,p,x);
}
int queryright(int k,int p,int x)
{
if (tree[k].L==tree[k].R) return tree[k].L;
int mid=tree[k].L+tree[k].R>>;
if (p<=mid) return isempty(k<<,p,tree[k<<].R,x)&&r[tree[k<<].R][x]?queryright(k<<|,tree[k<<|].L,x):queryright(k<<,p,x);
else return queryright(k<<|,p,x);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj1018.in","r",stdin);
freopen("bzoj1018.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
build(,,n);
char c=getchar();while (c<'A'||c>'Z') c=getchar();
while (c!='E')
{
int x=read(),y=read(),u=read(),v=read();
if (y>v) swap(x,u),swap(y,v);x--,u--;
if (c=='O')
{
if (y==v) modifyline(,y,);
else r[y][x]=,modifyrow(,y);
}
else if (c=='C')
{
if (y==v) modifyline(,y,);
else r[y][x]=,modifyrow(,y);
}
else
{
y=queryleft(,y,x);
v=queryright(,v,u);
printf(query(,y,v).f[whichop(x,y,u,v)]?"Y\n":"N\n");
}
c=getchar();while (c<'A'||c>'Z') c=getchar();
}
return ;
}

BZOJ1018 SHOI2008堵塞的交通(线段树)的更多相关文章

  1. BZOJ1018[SHOI2008]堵塞的交通——线段树

    题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...

  2. Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)

    P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...

  3. bzoj1018/luogu4246 堵塞的交通 (线段树)

    对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...

  4. BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)

    题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...

  5. [bzoj1018][SHOI2008]堵塞的交通traffic_线段树

    bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...

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

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

  7. bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...

  8. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  9. 【线段树】bzoj1018 [SHOI2008]堵塞的交通traffic

    线段树的每个叶子节点存一列. 每个节点维护六个域,分别是左上左下.左上右上.左上右下.左下右上.左下右下.右上右下在区间内部的连通性,不考虑绕出去的情况. 初始每个叶子的左上左下.右上右下是连通的. ...

随机推荐

  1. 腾讯笔试题 构造回文(LCS问题)

    给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢? 输出需要删除的字符个数. 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s. ...

  2. day61

    Vue 八.重要指令 v-bind <!-- 值a --> <div v-bind:class='"a"'></div> <!-- 变量a ...

  3. WebHook之PHP实践@coding.net

    次写完代码, 打开FileZilla, 把写好的文件上传到vps上, 久而久之觉得腻烦, 寻思有没有更geek的方法, 便有此文. WebHook是跟随着Git而兴起的技术, 当你push到服务器的时 ...

  4. [Lydsy1805月赛]对称数 BZOJ5361

    分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑 ...

  5. activiti发布APP时报错:关联的流程无效

    解决办法: 1.检查流程命名和任务命名以及其他命名中是否有特殊字符,有一些字符是不支持的.(中文是可以的,中文标点符号可能不行,我的经验是顿号会报错) 2.检查流程图,把鼠标放到每一根连接线上,观察它 ...

  6. 20155325 Exp9 Web安全基础

    本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验后回答问题 (1)SQL注入攻击原理,如何防御 原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击 ...

  7. ubuntu安装微信客户端

    安装linux微信: apt-get install git git clone https://github.com/geeeeeeeeek/electronic-wechat.git cd ele ...

  8. Android 实现 WheelView

    wheel view 目录(?)[-] Android WheelView效果图 网上的开源代码 实现思路 扩展Gallery 如何使用 我们都知道,在iOS里面有一种控件------滚筒控件(Whe ...

  9. android studio 下载 sdk 失败

    android studio 打开项目出现以下错误时,点击去安装,会提示"All packages are not available for download" 错误. 解决办法 ...

  10. 代理神器allproxy

    背景 allproxy意为all as proxy,即是说所有设备均可以成为一个网络代理,唯一的要求就是有网络访问权限. 一般的代理软件要求宿主机必须有公网地址,然后才能把网络代理出去,但在实际情况下 ...