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 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
随机推荐
- 网络对抗技术 2017-2018-2 20152515 Exp7 信息搜集与漏洞扫描
1. 实践内容(3.5分) 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为. 原理:如果可以冒充域名服务器,然后把查询的 ...
- 20155229《网络对抗技术》Exp:网络欺诈防范
实验内容 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站. 实验步骤 简单应用SET工具建立冒名网 ...
- 20155323刘威良《网络对抗》Exp8 Web基础
20155323刘威良<网络对抗>Exp8 Web基础 实践内容 (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编 ...
- VS与Opencv的亲密接触之安装配置过程
最近想把FPGA采集的图像,上传到上位机显示,看到Opencv能帮大忙,所以就折腾折腾! 我用的是VS2012和opencv-2.4.10-2.4.10(目前的最新版本),那个版本无所谓,本文都将适用 ...
- winform和wpf如何实现鼠标穿透的效果
先看一下鼠标穿透的效果: 可以看到Form1这个程序虽然遮在了桌面的上面,但是我们还可以在窗体上点击桌面上的必应词典和网易邮箱大师,好像这个叫“Form1”的窗口被“穿透”一样. winform版本: ...
- Please restart this script from an administrative PowerShell
问题 在上一篇<MSBUILD : error MSB3428: 未能加载 Visual C++ 组件"VCBuild.exe">,安装时失败了,提示: 解决办法 1. ...
- C# Language Specification 5.0 (翻译)第一章 引言
C#(念作 See Sharp)是一种简单.现代.面向对象并且类型安全的编程语言.C# 源于 C 语言家族,因此 C.C++ 和 Java 工程师们能迅速上手.ECMA 国际[1](ECMA Inte ...
- python数据图形化—— matplotlib 基础应用
matplotlib是python中常用的数据图形化工具,用法跟matlab有点相似.调用简单,功能强大.在Windows下可以通过命令行 pip install matplotlib 来进行安装. ...
- pandas 初识(二)
基本统计 pivot_table(数据透视表 ): 使用appfunc, 按不同index分类统计各特征values的值 df.pivot_table(index="Pclass" ...
- 安装logstash及logstash的初步使用-处理DNS日志
安装logstash 需要高版本的java 使用1.4版本的java会有报错 # Can't start up: not enough memory 查询java信息 rpm -qa | grep j ...