【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)
题意:一个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(线段树,网格图,连通性)的更多相关文章
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- 【bzoj1018】[SHOI2008]堵塞的交通traffic 线段树区间合并+STL-set
题目描述 给出一张2*n的网格图,初始每条边都是不连通的.多次改变一条边的连通性或询问两个点是否连通. 输入 第一行只有一个整数C,表示网格的列数.接下来若干行,每行为一条交通信息,以单独的一行“Ex ...
- Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)
这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...
- bzoj1018[SHOI2008]堵塞的交通traffic——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1018 巧妙的线段树.维护矩阵四个角的连通性. 考虑两个点连通的可能路径分成3部分:两点左边. ...
- BZOJ 1018 堵塞的交通traffic(线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1018 题意:一个2*n的格子,相邻格子之间有一条道路.初始时道路是不通的. 三种操作:( ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- 【BZOJ1018】堵塞的交通(线段树)
[BZOJ1018]堵塞的交通(线段树) 题面 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网 ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
随机推荐
- Mybatis学习记录(1)
1.Mybatis介绍 Mybatis是apache的一个开源项目iBatis,Mybatis是一个优秀的持久层框架,他对jdbc的操作数据库的过程进行封装,使开发者只需要关注sql本身,不需 ...
- Unity3d 判断物体是否在可见范围内
unity中自带两个回调函数: void OnBecameVisible()//当物体可见时,回调一次. void OnBecameInvisible()//当物体不可见时,回调一次. 在untiy编 ...
- sphinx关键字套红
sphinx定义搜索结果,搜索的内容着重显示,可以使用下面代码 <?php /** * Created by PhpStorm. * User: pc00001 * Date: 2015/4/1 ...
- k8s 基于NFS部署storageclass pv自动供给
在k8s中部署有状态应用时,通常需要做数据持久化存储. 后端存储的方式有以下几种: 1.基于宿主机本地的存储方式: (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节 ...
- kali下安装中文输入法
参考网址:https://blog.csdn.net/qq_37367124/article/details/79229739 更性源 vim /etc/apt/source.list 设置更新源 更 ...
- CentOS7 安装操作命令
#timedatectl set-timezone Asia/Shanghai 关闭SELinux vi /etc/sysconfig/selinux #SELINUX=enforcing SELIN ...
- 如何使用jmeter做接口测试
1.传参:key=value形式 2.传参:json格式 3.jmeter上传文件 4.jmeter传cookie 或者使用 HTTP Cookie管理器
- python标准输入输出
input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘. input 可以接收一个Python表达式作为输入,并将运算结果返回. print()和format( ...
- how to setting a i2c driver
How to instantiate I2C devices============================== Unlike PCI or USB devices, I2C devices ...
- k短路模板
https://acm.taifua.com/archives/jsk31445.html 链接: https://nanti.jisuanke.com/t/31445 #include <io ...