题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路

一开始每条道路都是堵塞的,堵塞即为不可经过。经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了

多次询问,询问两个城市是否联通

C,q<=1e5

思路:From https://www.cnblogs.com/MashiroSky/p/5973686.html

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 110000
#define M 41
#define eps 1e-8
#define pi acos(-1) struct node
{
int U,D,l,r,u,d,p,q;
}t[N<<];
int n;
char s[]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void pushup(node &p,node l,node r)
{
p.l=l.l|(l.u&p.U&r.l&p.D&l.d);
p.r=r.r|(r.u&p.U&l.r&p.D&r.d);
p.u=(l.u&p.U&r.u)|(l.q&p.D&r.p);
p.d=(l.d&p.D&r.d)|(l.p&p.U&r.q);
p.q=(l.u&p.U&r.q)|(l.q&p.D&r.d);
p.p=(l.d&p.D&r.p)|(l.p&p.U&r.u);
} void build(int l,int r,int p)
{
if(l==r)
{
t[p].U=t[p].D=t[p].u=t[p].d=;
return;
}
int mid=(l+r)>>;
build(l,mid,p<<);
build(mid+,r,p<<|);
} void updater(int l,int r,int x,int y,int v,int p)
{
int mid=(l+r)>>;
if(x==mid)
{
if(y==) t[p].U=v;
else t[p].D=v;
pushup(t[p],t[p<<],t[p<<|]);
return;
}
if(x<=mid) updater(l,mid,x,y,v,p<<);
else updater(mid+,r,x,y,v,p<<|);
pushup(t[p],t[p<<],t[p<<|]);
} void updatec(int l,int r,int x,int v,int p)
{
int mid=(l+r)>>;
if(l==r)
{
t[p].l=t[p].r=t[p].p=t[p].q=v;
return;
}
if(x<=mid) updatec(l,mid,x,v,p<<);
else updatec(mid+,r,x,v,p<<|);
pushup(t[p],t[p<<],t[p<<|]);
} node query(int l,int r,int x,int y,int p)
{
int mid=(l+r)>>;
if(x<=l&&r<=y) return t[p];
if(y<=mid) return query(l,mid,x,y,p<<);
else if(x>mid) return query(mid+,r,x,y,p<<|);
else
{
node tmp=t[p];
pushup(tmp,query(l,mid,x,y,p<<),query(mid+,r,x,y,p<<|));
return tmp;
}
} int main()
{
freopen("bzoj1018.in","r",stdin);
freopen("bzoj1018.out","w",stdout);
scanf("%d",&n);
build(,n,);
int r1,r2,c1,c2;
while(scanf("%s",s)!=EOF)
{
if(s[]=='E') break;
scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
if(c1>c2)
{
swap(c1,c2);
swap(r1,r2);
}
if(s[]=='O')
{
if(r1==r2) updater(,n,c1,r1,,);
else updatec(,n,c1,,);
}
if(s[]=='C')
{
if(r1==r2) updater(,n,c1,r1,,);
else updatec(,n,c1,,);
}
if(s[]=='A')
{
node l=query(,n,,c1,),
x=query(,n,c1,c2,),
r=query(,n,c2,n,);
int ans; if(r1==&&r2==)
ans=x.u|(l.r&x.p)|(x.q&r.l)|(l.r&x.d&r.l); if(r1==&&r2==)
ans=x.q|(l.r&x.d)|(x.u&r.l)|(l.r&x.p&r.l); if(r1==&&r2==)
ans=x.p|(l.r&x.u)|(x.d&r.l)|(l.r&x.q&r.l); if(r1==&&r2==)
ans=x.d|(l.r&x.q)|(x.p&r.l)|(l.r&x.u&r.l);
if(ans) printf("Y\n");
else printf("N\n");
}
}
return ;
}

【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)的更多相关文章

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

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

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

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

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

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

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

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

  5. Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)

    这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...

  6. bzoj1018[SHOI2008]堵塞的交通traffic——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...

  7. BZOJ 1018 堵塞的交通traffic(线段树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1018 题意:一个2*n的格子,相邻格子之间有一条道路.初始时道路是不通的. 三种操作:( ...

  8. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

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

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

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

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

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

随机推荐

  1. ES6_Promise 对象 阮一锋

    Promise的含义 promise是异步编程的一种解决方法,比传统的回调函数和事件更合理更强大.他由社区最早提出和实现,ES6将其写进语言标准,统一了用法,原生提供了promise对象.所谓prom ...

  2. tensorflow目标检测API之训练自己的数据集

    1.训练文件的配置 将生成的csv和record文件都放在新建的mydata文件夹下,并打开object_detection文件夹下的data文件夹,复制一个后缀为.pbtxt的文件到mtdata文件 ...

  3. C++ 学习笔记(一) cout 与printf 的不同之处

    作为一个嵌入式开发的猿,使用打印调试程序是必不可少的,拿到新的项目第一件事就是捣鼓打印.这次也不例外有打印才有耍下去的底气.在之前零零碎碎的C++学习中,还是一边学一边做项目的状态下能用printf解 ...

  4. Redis错误解决:(error) MISCONF Redis is configured to save RDB snapshots

    刚开始学习使用redis数据库,在执行删除命令时,提示了我这么一个错误: 错误提示 (error) MISCONF Redis is configured to save RDB snapshots, ...

  5. NodeJS基础入门-Buffer

    Buffer.byteLength console.log(Buffer.byteLength('test')); console.log(Buffer.byteLength('我是C语言爱好者')) ...

  6. 多线程辅助类之CyclicBarrier(四)

    CyclicBarrier是一个线程辅助类,和<多线程辅助类之CountDownLatch(三)>功能类似,都可以实现一组线程的相互等待.要说不通点,那就是CyclicBarrier在释放 ...

  7. Linux异常体系之vector_stub宏解析

    ARM-Linux汇编的宏定义语法说明如下: 使用注意: 1.宏定义以.macro开始,以.endm结束 2.可带参数,参数可有默认值 3.直接使用参数的名字\arg vector_stub宏的功能: ...

  8. Python之code对象与pyc文件(一)

    Python程序的执行过程 我们都知道,C语言在执行之前需要将源代码编译成可执行的二进制文件,也就是将源代码翻译成机器代码,这种二进制文件一旦生成,即可用于执行.但是,Python是否一样呢?或许很多 ...

  9. python基础学习笔记——正则表达式

    1.什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 r ...

  10. NHibernate N+1问题实例分析和优化

    1.问题的缘起 考察下面的类结构定义 public class Category { string _id; Category _parent; IList<Category> _chil ...