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 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
随机推荐
- 20155334 曹翔 《网络对抗》逆向及Bof基础
20155334 曹翔 <网络对抗>逆向及Bof基础 实践目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...
- Luogu P2577 [ZJOI2005]午餐
一道贪心+类背包DP的好题 首先发现一个十分显然的性质,没有这个性质整道题目都难以下手: 无论两队的顺序如何,总是让吃饭慢的人先排队 这是一个很显然的贪心,因为如果让吃饭慢的排在后面要更多的时间至少没 ...
- mfc CIPAddressCtrl控件
知识点: CIPAddressCtrl 属性 CIPAddressCtrl 成员函数 成员函数代码测试 一.CIPAddressCtrl Class Members IsBlank Determine ...
- JavaScript组成—— DOM、BOM、ECMAScript
ECMAScript是JS的核心:提供核心语言功能 DOM(文档对象模型):提供访问和操作网页内容的方法和接口 BOM(浏览器对象模型):提供与浏览器交互的方法和接口 1. DOM(文档对象模型) 1 ...
- laraver框架学习------工厂模型填充测试数据
在laravel中填充数据有几种方式.一种是Seeder,另一种是工厂模式进行的填充. 工厂模式可以实现大批量的填充数据,数据的量可以自定义.这也为后续的软件测试提供方便. 在laravel框架有da ...
- BugkuCTF web2
前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...
- Json和Map互转,四个包(org.json/net.sf.json/com.google.gson/com.alibaba.fastjson)
目前使用的(org.json/net.sf.json/com.google.gson/com.alibaba.fastjson)这四种json-map互转,其他的以后在补充.............. ...
- 小刘的机器学习---SVM
前言: 这是一篇记录小刘学习机器学习过程的随笔. 正文: 支持向量机(SVM)是一组用于分类, 回归和异常值检测的监督学习方法. 在分类问题中,SVM就是要找到一个同时离各个类别尽可能远的决策边界即最 ...
- MYSQL数据库封装类
<?phpclass DBDA{ public $host="localhost"; public $uid="root"; publi ...
- PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树
根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...