用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. javascript版快速排序和冒泡排序

    var sort = (function () { //快速排序 var quickSort = { partition: function (array, low, high) { if (low ...

  2. 通过图片对比带给你不一样的KMP算法体验

    KMP 算法,俗称“看毛片”算法,是字符串匹配中的很强大的一个算法,不过,对于初学者来说,要弄懂它确实不易. 笔者认为,KMP 算法之所以难懂,很大一部分原因是很多实现的方法在一些细节的差异.体现在几 ...

  3. 切换jdk版本

    切换JDK 开发中jdk版本需要是1.3.1,当前电脑中用的是jdk1.8 下载jdk1.3.1 可以在官网上下,但是我捣鼓半天,发现下载又慢又需要账号,所以在CSDN下了个 地址,可以下载第一个ex ...

  4. Ingress 记萌新的第一次连多重(xjbl)

    之前为了升七,ArtanisWei学长告诉我可以去紫金园雕塑[这是什么地方啊],顺带靠卖萌骗了一桶key 于是屁颠屁颠的跑去按照群里攻略开始连多重[馒头 by handsomepeach],连了一百年 ...

  5. TypeError: window.open is not a function

    想必大家现在都已经到家了,而苦逼的我还要坐在办公室混拿微薄的工资,技不如人,平常不努力给自己充电,年终一毛钱都没多给.不说这扫兴的话题了,在这给同样在苦逼坚守岗位的同志们节日的问候,新的一年,好运连连 ...

  6. JS中关于clientWidth offsetWidth scrollWidth 等的含义

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  7. Linux用sendmail发信失败,提示Connection refused by [127.0.0.1]

    现象: Linux用sendmail发信失败,提示Connection refused by [127.0.0.1] 29 14:10:44 iZ257p7xxilZ sendmail[3395]: ...

  8. 如何更方便地调试javascript代码

    开发者工具 现在一般的浏览器都内置了开发者工具,快捷键F12可以打开,如Chrome浏览器下,Sources面板下找到对应的js文件 这是首选方法,但是对于SPA程序(比如easyui),可能找不到内 ...

  9. [转载] 百度上传&下载脚本

    下载百度网盘中的文件,最简单的办法是使用wget命令.找到百度网盘文件,点击下载,然后找到相应的下载地址,复制链接地址即可.但这种方法有一个bug,因为百度云网盘访问文件的链接地址是动态的,当文件比较 ...

  10. Yann LeCun, Geoffrey E. Hinton, and Yoshua Bengio