题目很好明白,然后实现很神奇。首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行。然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优。于是看了题解,发现了线段树的神奇用途。

我们维护每个矩形四个顶点的六个变量,分别是:

g[0]:表示第一行左右端点的连通性。

g[1]:表示第二行左右端点的连通性。

g[2]:左上端点和左下端点的连通性。

g[3]:右上端点和右下端点的连通性。

g[4]:左上端点和右下端点的连通性。

g[5]:左下端点和右上端点的连通性。

这六个变量做好之后就可以合并矩形了。同样是这六个变量,合并的时候需要费点事,考虑一下各种情况。

最后需要的一点就是可能出现的特殊情况,这样的怎么办?

我们考虑全面即可,查询的时候不光查询一个区间,还需要查询两头的区间,然后判断是否会出现这种情况,就是我写的solve函数里面判断答案的后三种情况。 ——by VANE

#include<bits/stdc++.h>
using namespace std;
const int N=;
struct node{bool g[];};
int n;
node s[],t[N*];
bool m[N*];
int calc(int x,int y){return x*(n-)+y;}
void build(int rt,int l,int r)
{
if(l==r) {t[rt]=s[];return;}
int mid=l+r>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
node merge(node a,node b,bool x,bool y)
{
node c;
c.g[]=(a.g[]&&x&&b.g[])||(a.g[]&&y&&b.g[]);
c.g[]=(a.g[]&&y&&b.g[])||(a.g[]&&x&&b.g[]);
c.g[]=(a.g[])||(a.g[]&&x&&b.g[]&&y&&a.g[]);
c.g[]=(b.g[])||(b.g[]&&x&&a.g[]&&y&&b.g[]);
c.g[]=(a.g[]&&x&&b.g[])||(a.g[]&&y&&b.g[]);
c.g[]=(b.g[]&&x&&a.g[])||(b.g[]&&y&&a.g[]);
return c;
}
void insert(int rt,int l,int r,int x,int y,int xx,int yy,bool c)
{
int mid=l+r>>;
if(x==xx&&y==mid)
{
m[calc(x,y)]=c;
t[rt]=merge(t[rt<<],t[rt<<|],m[calc(,mid)],m[calc(,mid)]);
return;
}
else if(x!=xx&&l==r){t[rt]=s[c];return;}
if(y<=mid) insert(rt<<,l,mid,x,y,xx,yy,c);
if(y>mid) insert(rt<<|,mid+,r,x,y,xx,yy,c);
t[rt]=merge(t[rt<<],t[rt<<|],m[calc(,mid)],m[calc(,mid)]);
}
node query(int rt,int l,int r,int ll,int rr)
{
int mid=r+l>>;
if(l>=ll&&r<=rr) return t[rt];
if(rr<=mid)return query(rt<<,l,mid,ll,rr);
if(ll>mid) return query(rt<<|,mid+,r,ll,rr);
return merge(query(rt<<,l,mid,ll,rr),query(rt<<|,mid+,r,ll,rr),m[calc(,mid)],m[calc(,mid)]);
}
void solve(int x,int y,int xx,int yy)
{
bool ans;
s[]=query(,,n,,y);
s[]=query(,,n,y,yy);
s[]=query(,,n,yy,n);
if(x==xx) ans=(s[].g[x])||(s[].g[]&&s[].g[+x^])||(s[].g[]&&s[].g[+x])||(s[].g[]&&s[].g[]&&s[].g[x^]);
else ans=(s[].g[+x])||(s[].g[]&&s[].g[x^])||(s[].g[]&&s[].g[x])||(s[].g[]&&s[].g[+x^]&&s[].g[]);
if(ans) puts("Y");
else puts("N"); }
int main()
{
scanf("%d",&n);
s[]=(node){,,,,,};
s[]=(node){,,,,,};
memset(t,,sizeof t);
memset(m,,sizeof m);
build(,,n);
char ch[];scanf("%s",ch);
while(ch[]!='E')
{
int x,y,xx,yy;scanf("%d%d%d%d",&x,&y,&xx,&yy);
if(y>yy) swap(x,xx),swap(y,yy);
x--;xx--;
if(ch[]=='O') insert(,,n,x,y,xx,yy,);
else if(ch[]=='C') insert(,,n,x,y,xx,yy,);
else solve(x,y,xx,yy);
scanf("%s",ch);
}
}

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

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

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

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

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

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

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

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

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

  5. [HNOI2014] 道路堵塞 - 最短路,线段树

    对不起对不起,辣鸡蒟蒻又来用核弹打蚊子了 完全ignore了题目给出的最短路,手工搞出一个最短路,发现对答案没什么影响 所以干脆转化为经典问题:每次询问删掉一条边后的最短路 如果删掉的是非最短路边,那 ...

  6. [BZOJ1018]堵塞的交通traffic

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

  7. 【BZOJ1018】堵塞的交通(线段树)

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

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

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

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

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

随机推荐

  1. 应用于网站导航中的 12 个 jQuery 插件

    当考虑到网页设计时,导航被认为是使网页以用户友好方式展现的一个重要部分.在现代的交互网站中,导航起着至关重要的作用,如果没有正确地处理会影响你网站的访问.适当的导航工具能够帮助用户在网站的不同页面内容 ...

  2. 引用类型 ( 对象定义 )——Object 类型

    本文地址:http://www.cnblogs.com/veinyin/p/7607100.html  创建实例 new 操作符后跟构造函数 var people = new Object(); pe ...

  3. Unity下实现弹簧骨骼(Spring Bone)

    关于这个效果的名称,我一直没找到一个比较正式的说法.Spring Bone这个说法是来自于Anima2D这个插件中的一个演示用的脚本,我直接译成弹簧骨骼. 一般常见于对人物的头发的模拟上. 当然也可以 ...

  4. VC连接access

    (1)首先拷贝 c:\program files\common files\system\ado\ 目录中的 msado15.dll 文件到项目中. (2)在VC中加入DLL,具体方法如下: (3)创 ...

  5. filezilla显示隐藏文件

    我们在习惯使用flashfxp等工具,但是随着主机商限制较多,这些老的FTP工具不怎么好用了,比如主机商会推荐使用到Filezilla等工具.但是比如息壤主机,我们在管理linux环境下htacess ...

  6. Problem D. Berland Railroads Gym - 101967D (思维)

    题目链接:https://cn.vjudge.net/contest/274029#problem/D 题目大意:给你0-9每个数的个数,然后让你找出最大的数,满足的条件是任意三位相连的都能被三整除. ...

  7. 64_p10

    python3-matplotlib-qt4-2.0.0-2.fc26.2.x86_64.rpm 05-Apr-2017 09:54 29438 python3-matplotlib-qt5-2.0. ...

  8. 141.Linked List Cycle---双指针

    题目链接 题目大意:给出一个链表,判断该链表是否有环,空间复杂度最好控制在o(1) 这个题没有给测试用例,导致没太明白题目意思,看了题解,用了两种方法示例如下: 法一(借鉴):利用两个指针,一个指针步 ...

  9. centos-testlink安装使用手册

    1.新建虚拟机设置 网卡必须选择ovirtmgmt模式 2.Centos6.3系统安装 说明: 1.CentOS 6.3系统镜像有两个,安装系统只用到第一个镜像即CentOS-6.3-i386-bin ...

  10. [写出来才有价值系列:node.js]node.js 02-,learnyounode

    安装learnyounode: npm install g learnyounode 官方说直接 但是我发现不行,很慢几乎就是死在那里了 还好有淘宝的东西给我们用https://npm.taobao. ...