用8个bool维护即可分别为LURU,LURD,LDRU,LDRD,LULD,RURD,Side[1],Side[2]即可。

Side表示这一块有没有接到右边。Merge一下就可以了。码农题,WA了一次,发现未初始化,就AC了。。

 #include <cstdio>
inline int Min(int x,int y) {return x>y?y:x;}
inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
inline void Get_Int(int &x)
{
char ch=getchar(); x=;
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
}
//========================================
const int Maxn=;
struct Node
{
bool LURU,LURD,LDRU,LDRD,LULD,RURD,Side[];
}Tree[Maxn<<],Null;
int x1,y1,x2,y2,n;
char ch[];
inline Node Merge(Node L,Node R)
{
Node Ret; Ret=Null;
Ret.Side[]=R.Side[],Ret.Side[]=R.Side[];
if ((L.LURU&&R.LURU&&L.Side[]) || (L.LURD&&R.LDRU&&L.Side[])) Ret.LURU=true;
if ((L.LDRD&&R.LDRD&&L.Side[]) || (L.LDRU&&R.LURD&&L.Side[])) Ret.LDRD=true;
if ((L.LURU&&R.LURD&&L.Side[]) || (L.LURD&&R.LDRD&&L.Side[])) Ret.LURD=true;
if ((L.LDRD&&R.LDRU&&L.Side[]) || (L.LDRU&&R.LURU&&L.Side[])) Ret.LDRU=true;
if (L.LULD || (L.LURU&&L.LDRD&&R.LULD&&L.Side[]&&L.Side[])) Ret.LULD=true;
if (R.RURD || (R.LURU&&R.LDRD&&L.RURD&&L.Side[]&&L.Side[])) Ret.RURD=true;
return Ret;
}
void Build(int o,int l,int r)
{ if (l==r)
{
Tree[o].LURU=Tree[o].LDRD=true;
return;
}
int mid=(l+r)>>;
Build(o<<,l,mid),Build(o<<|,mid+,r);
Tree[o]=Merge(Tree[o<<],Tree[o<<|]);
}
void Modify_X(int o,int l,int r,int pos,bool kind)
{
if (l==r)
{
Tree[o].LULD=Tree[o].RURD=Tree[o].LURD=Tree[o].LDRU=kind;
return;
}
int mid=(l+r)>>;
if (pos<=mid) Modify_X(o<<,l,mid,pos,kind); else Modify_X(o<<|,mid+,r,pos,kind);
Tree[o]=Merge(Tree[o<<],Tree[o<<|]);
}
void Modify_Y(int o,int l,int r,int pos,int x,bool kind)
{
if (l==r)
{
Tree[o].Side[x]=kind;
return;
}
int mid=(l+r)>>;
if (pos<=mid) Modify_Y(o<<,l,mid,pos,x,kind); else Modify_Y(o<<|,mid+,r,pos,x,kind);
Tree[o]=Merge(Tree[o<<],Tree[o<<|]);
}
inline void Close()
{
if (x1==x2) Modify_Y(,,n,Min(y1,y2),x1,false);
if (y1==y2) Modify_X(,,n,y1,false);
}
inline void Open()
{
if (x1==x2) Modify_Y(,,n,Min(y1,y2),x1,true);
if (y1==y2) Modify_X(,,n,y1,true);
}
Node Query(int o,int l,int r,int p,int q)
{
if (l==p && r==q)
{
Node Ret=Tree[o];
return Ret;
}
int mid=(l+r)>>;
if (q<=mid) return Query(o<<,l,mid,p,q);
if (p>=mid+) return Query(o<<|,mid+,r,p,q);
if (p<=mid && q>=mid+)
return Merge(Query(o<<,l,mid,p,mid),Query(o<<|,mid+,r,mid+,q));
}
inline bool Check()
{
if (y1>y2) Swap(y1,y2),Swap(x1,x2);
Node Pre,Suf,Now;
if (y1->=) Pre=Query(,,n,,y1-); else Pre=Null;
if (y2+<=n) Suf=Query(,,n,y2+,n); else Suf=Null;
Now=Query(,,n,y1,y2);
if (x1==x2)
{
if ((x1==) && ((Now.LURU) || (Pre.RURD&&Pre.Side[]&&Pre.Side[]&&Now.LDRU) || (Suf.LULD&&Now.Side[]&&Now.Side[]&&Now.LURD) || (Pre.RURD&&Suf.LULD&&Now.Side[]&&Now.Side[]&&Pre.Side[]&&Pre.Side[]&&Now.LDRD))) return true;
if ((x1==) && ((Now.LDRD) || (Pre.RURD&&Pre.Side[]&&Pre.Side[]&&Now.LURD) || (Suf.LULD&&Now.Side[]&&Now.Side[]&&Now.LDRU) || (Pre.RURD&&Suf.LULD&&Now.Side[]&&Now.Side[]&&Pre.Side[]&&Pre.Side[]&&Now.LURU))) return true;
} else
{
if ((x1== && x2==) && ((Now.LURD) || (Pre.RURD&&Pre.Side[]&&Pre.Side[]&&Now.LDRD) || (Suf.LULD&&Now.Side[]&&Now.Side[]&&Now.LURU) || (Pre.RURD&&Suf.LULD&&Now.Side[]&&Now.Side[]&&Pre.Side[]&&Pre.Side[]&&Now.LDRU))) return true;
if ((x1== && x2==) && ((Now.LDRU) || (Pre.RURD&&Pre.Side[]&&Pre.Side[]&&Now.LURU) || (Suf.LULD&&Now.Side[]&&Now.Side[]&&Now.LDRD) || (Pre.RURD&&Suf.LULD&&Now.Side[]&&Now.Side[]&&Pre.Side[]&&Pre.Side[]&&Now.LURD))) return true;
}
return false;
}
inline void Ask() {if (Check()) puts("Y"); else puts("N");}
int main()
{
// freopen("c.in","r",stdin);
Get_Int(n); Build(,,n);
Null.LURU=Null.LURD=Null.LDRU=Null.LDRD=Null.Side[]=Null.Side[]=Null.LULD=Null.RURD=false;
while (scanf("%s",ch)!=EOF)
{
if (ch[]=='E') break;
Get_Int(x1),Get_Int(y1),Get_Int(x2),Get_Int(y2);
if (ch[]=='O') Open();
if (ch[]=='C') Close();
if (ch[]=='A') Ask();
}
return ;
}

C++

BZOJ 1018 线段树维护图连通性的更多相关文章

  1. BZOJ 1018 线段树维护图的连通性问题

    思路: 我们可以搞一棵线段树 对于一段区间有6种情况需要讨论 左上右下.左上右上.左下右下.左下右上 这四种比较好维护 用左上右下举个例子吧 就是左儿子的左上右下&左区间到右区间下面有路&am ...

  2. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  3. BZOJ 2124 线段树维护hash值

    思路: http://blog.csdn.net/wzq_QwQ/article/details/47152909 (代码也是抄的他的) 自己写得垃圾线段树怎么都过不了 隔了两个月 再写 再挂 又隔了 ...

  4. bzoj 4127 线段树维护绝对值之和

    因为d>=0,所以一个位置的数只会单调不降并且只会有一次穿过0. 用这个性质,我们我可在线段树中记录正数负数的个数和和,以及最大的负数以及答案. 修改操作:如果当前最大负数+d<=0,那么 ...

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

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

  6. [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】

    题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过  1018,即使它在 ProblemSet 的第一页 ...

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

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

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

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

  9. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

随机推荐

  1. 前端优化之图片延迟加载(lazyload.js)

    要想缩短首屏加载时间,思路一般是减少http请求次数和降低每次的请求量.本文中使用现成的lazyload.js插件,文末会放出下载地址. lazyload.js可以实现图片分批次加载,不是一次性加载完 ...

  2. 【翻译】configuration changes与handler.post

    原文地址 http://corner.squareup.com/2013/12/android-main-thread-2.html 在前一部分里面previous part ,我们深入挖掘了 loo ...

  3. 前端常用的几个js判断(二)

    10.鼠标悬停(hover)切换 class 属性假如当用户鼠标悬停在一个可点击的元素上时,你希望改变其效果,下面这段代码可以在其悬停在元素上时添加 class 属性,当用户鼠标离开时,则自动取消该 ...

  4. C#中XML和json互相转换

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...

  5. BZOJ3143 [Hnoi2013]游走

    首先高斯消元解出每个点被走到的概率 注意到这里走到$n$就停下来了,所以$P(n) = 0$ 解出来以后,给每条边$(u, v)$赋边权$P(u) + P(v)$即可,然后直接贪心 /******** ...

  6. ASP.NET MVC为字段设置多语言显示 [转]

    这段时间一直在忙.NET的项目,今天就写一下关于.NET的文章吧,也很长时间没写过.NET的啦  在使用ASP.NET MVC3 的时候,使用元数据模式可以非常方便地设置每个 字段(或者说属性)以减少 ...

  7. AntiXSS v4.0中Sanitizer.GetSafeHtmlFragment等方法将部分汉字编码为乱码的解决方案

    AntiXSS v4.0中Sanitizer.GetSafeHtmlFragment等方法将部分汉字编码为乱码的解决方案 以下代码为asp.net环境下,c#语言编写的解决方案.数据用Dictiona ...

  8. java时间戳

    1.时间戳的定义 时间戳是指文件属性里的创建.修改.访问时间. 数字时间戳技术是数字签名技术一种变种的应用.在电子商务交易文件中,时间是十分重要的信息.在书面合同中,文件签署的日期和签名一样均是十分重 ...

  9. UILabel多种字体

    UILabel *label = [[UILabel alloc] init]; label.text = @"UILabel多种字体"; UIFont *font = [UIFo ...

  10. 点击document隐藏某个div

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...