bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况
区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并
查询a,b答案的话,不仅可以直接从[a,b]区间连通,也有可能从旁边绕了一圈
总之细节很多 懒得写了
升级版:suoi33 诡异的交通
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
bool ll,rr,uu,ud,du,dd;
int c[],l,r;
Node(bool a=,bool b=,bool cr=,bool d=,bool e=,bool f=,int x=,int y=,int i=,int j=){
ll=a,rr=b,uu=cr,ud=d,du=e,dd=f;
l=x,r=y;c[]=i,c[]=j;
}
}t[maxn*];
int N,pct;
bool con[maxn][]; inline void print(Node x){
printf("[%d,%d]->[%d,%d]&[%d,%d]:\n",x.l,x.r,t[x.c[]].l,t[x.c[]].r,t[x.c[]].l,t[x.c[]].r);
// printf("[%d,%d]->%d,%d:\n",x.l,x.r,x.c[0],x.c[1]);
printf("\tUU:%d UD:%d DD:%d DU:%d LL:%d RR:%d\n",x.uu,x.ud,x.dd,x.du,x.ll,x.rr);
}
inline void flash(Node &x){
x.uu|=(x.ud&&x.rr)||(x.ll&&x.du)||(x.ll&&x.dd&&x.rr);
x.dd|=(x.du&&x.rr)||(x.ll&&x.ud)||(x.ll&&x.uu&&x.rr);
x.ud|=(x.uu&&x.rr)||(x.ll&&x.dd)||(x.ll&&x.du&&x.rr);
x.du|=(x.dd&&x.rr)||(x.ll&&x.uu)||(x.ll&&x.ud&&x.rr);
}
Node operator + (Node a,Node b){
Node p;
p.l=a.l,p.r=b.r;
int m=a.r;
p.uu=(a.uu&&con[m][]&&b.uu)||(a.ud&&con[m][]&&b.du);
p.dd=(a.dd&&con[m][]&&b.dd)||(a.du&&con[m][]&&b.ud);
p.ud=(a.uu&&con[m][]&&b.ud)||(a.ud&&con[m][]&&b.dd);
p.du=(a.dd&&con[m][]&&b.du)||(a.du&&con[m][]&&b.uu);
p.ll=a.ll||(a.uu&&con[m][]&&b.ll&&con[m][]&&a.dd);
p.rr=b.rr||(b.uu&&con[m][]&&a.rr&&con[m][]&&b.dd);
flash(p);
// print(p);
return p;
} inline void update(int p){
int l=t[p].c[],r=t[p].c[];
if(l&&r)t[p]=t[t[p].c[]]+t[t[p].c[]];
t[p].c[]=l,t[p].c[]=r;
} void build(int &p,int l,int r){
p=++pct;
if(l==r) t[p]=Node(,,,,,,l,r,,);
else{
int m=l+r>>;
build(t[p].c[],l,m);
build(t[p].c[],m+,r);
update(p);//print(t[p]);
}
} void query(int p,int l,int r,int x,int y,Node &re){
if(x<=l&&r<=y){
if(!re.l&&!re.r) re=t[p];
else re=re+t[p];
}else{
int m=l+r>>;
if(x<=m) query(t[p].c[],l,m,x,y,re);
if(y>=m+) query(t[p].c[],m+,r,x,y,re);
}
} void change1(int p,int l,int r,int x){
if(l<r){
int m=l+r>>;
if(x<=m) change1(t[p].c[],l,m,x);
else change1(t[p].c[],m+,r,x);
update(p);
// print(t[p]);
}
}
void change2(int p,int l,int r,int x,bool b){
if(l==r){
t[p].ud=t[p].du=t[p].ll=t[p].rr=b;
}else{
int m=l+r>>;
if(x<=m) change2(t[p].c[],l,m,x,b);
else change2(t[p].c[],m+,r,x,b);
update(p);
}
} inline void solve1(int r1,int c1,int r2,int c2,bool b){
if(r1==r2){
c1=min(c1,c2);
con[c1][r1-]=b;
change1(,,N,c1);
}else{
change2(,,N,c1,b);
}
} inline bool solve2(int r1,int c1,int r2,int c2){
Node a,b,c;
if(c1>c2) swap(r1,r2),swap(c1,c2);
query(,,N,,c1,a);
query(,,N,c1,c2,b);
query(,,N,c2,N,c);
//print(a);print(b);print(c);
b.ll|=a.rr,b.rr|=c.ll;
flash(b);
if(r1==){
if(r2==) return b.ud;
else return b.uu;
}else{
if(r2==) return b.dd;
else return b.du;
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
// for(i=1;i<N;i++) con[i][0]=con[i][1]=1;
build(i,,N);
while(){
char s[];
scanf("%s",s);
if(s[]=='E') break;
int a=rd(),b=rd(),c=rd(),d=rd();
if(s[]=='O'){
solve1(a,b,c,d,);
}else if(s[]=='C'){
solve1(a,b,c,d,);
}else{
bool x=solve2(a,b,c,d);
if(x) printf("Y\n");
else printf("N\n");
}
}
return ;
}
bzoj1018/luogu4246 堵塞的交通 (线段树)的更多相关文章
- BZOJ1018[SHOI2008]堵塞的交通——线段树
题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...
- BZOJ1018 堵塞的交通(线段树)
题目很好明白,然后实现很神奇.首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行.然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优.于是看了题解,发现了线段树的神奇用途. 我们维护 ...
- Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
- 【BZOJ1018】堵塞的交通(线段树)
[BZOJ1018]堵塞的交通(线段树) 题面 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网 ...
- [bzoj1018][SHOI2008]堵塞的交通traffic_线段树
bzoj-1018 SHOI-2008 堵塞的交通traffic 参考博客:https://www.cnblogs.com/MashiroSky/p/5973686.html 题目大意:有一天,由于某 ...
- 【bzoj1018】堵塞的交通
[bzoj1018]堵塞的交通 题意 一个\(2*n\)的格子,相邻格子之间有一条道路.初始时道路是不通的. \(C\)个操作,每个操作为三种中的一种:(1)某条道路连起来:(2)某条道路断开:(3) ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
随机推荐
- 服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka
原文:https://blog.csdn.net/dengyisheng/article/details/71215234 服务发现比较:Consul vs Zookeeper vs Etcd vs ...
- WPF 嵌入winform 控件
引入 WindowsFormsIntegration.dll 和 System.Windows.Forms.dll <Window x:Class="wgscd.Window1 ...
- 20155320 Exp3 免杀原理与实践
20155320 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. [基础问题回答] (1)杀软是如何检测出恶意代码的? 1.通过行为检 ...
- What's new in XAML of .NET 4.0( .NET 4.0中XAML的新功能 )
原文 What's new in XAML of .NET 4.0 What's new in XAML of .NET 4.0 Easy Object References with {x:Refe ...
- [胡泽聪 趣题选讲]大包子环绕宝藏-[状压dp]
Description 你有一个长方形的地图,每一个格子要么是一个障碍物,要么是一个有一定价值的宝藏,要么是一个炸弹,或者是一块空地.你的初始位置已经给出.你每次可以走到上.下.左.右这四个相邻的格子 ...
- mfc 进程的诞生和死亡
进程概念 进程的诞生 进程的死亡 一. 进程: .简单的说 双击一个EXE图标时,系统就会产生一个相应的进程,分配相应的资源,并执行相应的代码. .标准一些的说法: 进程是一个具有独立功能 ...
- 纯 CSS 利用 label + input 实现选项卡
clip 属性 用于剪裁绝对定位元素. .class { position:absolute; clip:rect(0px,60px,200px,0px); } scroll-behavior: sm ...
- Phabricator 在 centos 系统下发送 Email的配置
前言 phabricator 配置email 其实很简单,配好smtp 服务器.端口.协议.用户名和登陆密码,但过程却好麻烦. 开始时跟着官网配 sendmail ,又 google 又 baidu, ...
- swift学习:第一个swift ui程序
最近swift有点火,赶紧跟上学习.于是,个人第一个swift程序诞生了... 新建项目
- Jq_$.getJSON( )
jQuery中的$.getJSON( )方法函数主要用来从服务器加载json编码的数据,它使用的是GET HTTP请求.使用方法如下: $.getJSON( url [, data ] [, succ ...