对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况

区间[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 堵塞的交通 (线段树)的更多相关文章

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

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

  2. BZOJ1018 堵塞的交通(线段树)

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

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

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

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

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

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

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

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

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

  7. 【bzoj1018】堵塞的交通

    [bzoj1018]堵塞的交通 题意 一个\(2*n\)的格子,相邻格子之间有一条道路.初始时道路是不通的. \(C\)个操作,每个操作为三种中的一种:(1)某条道路连起来:(2)某条道路断开:(3) ...

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

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

  9. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

随机推荐

  1. mac开启Airdrop的硬件要求

    OS X 10.13之后,新的airdrop需要硬件支持,需要蓝牙4.0 以及Wi-Fi 5GHz 开启!!!! 对于 OS X 10.12 以下的旧系统.即使是有线网络也可以使用,通过以下命令开启有 ...

  2. 大数据入门第十二天——sqoop入门

    一.概述 1.sqoop是什么 从其官网:http://sqoop.apache.org/ Apache Sqoop(TM) is a tool designed for efficiently tr ...

  3. python 回溯法 子集树模板 系列 —— 1、8 皇后问题

    问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的 ...

  4. 蓝牙disable流程简述

    蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放. 这里简单说一下其流程,就直接从协议栈的disable的接口说起了. static int disable(v ...

  5. 对html第一次尝试

    1.对于写文档                         修改后缀为html,双击进入为网页模式. 2.编写网页 1)新建 2)基本格式 <!DOCTYPE html><!-- ...

  6. DevOps架构下如何进行微服务性能测试?

    一. 微服务架构下的性能测试挑战 微服务与DevOps 微服务是实现DevOps的重要架构 微服务3S原则 DevOps核心点 微服务架构下的业务特点 亿级用户的平台 单服务业务随时扩容 服务之间存在 ...

  7. 微软职位内部推荐-Principal Software Eng Mgr

    微软近期Open的职位: Job Title: &nbsp Principal Software Eng Mgr Work Location: Shanghai, China Job Desc ...

  8. PAT甲题题解-1050. String Subtraction (20)-水题

    #include <iostream> #include <cstdio> #include <string.h> #include <algorithm&g ...

  9. 20135337朱荟潼 Linux第一周学习总结——计算机是如何工作的

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC-1000029000 1.冯诺依曼体系结 ...

  10. BFS和DFS算法

    昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...