[SHOI2008]堵塞的交通(线段树维护联通性)
题目
2行c列个点,开始时互不联通,支持给同一列或着同一行相邻的两个点连边,和询问两个点能否在一个联通块里。
1≤C≤100000 1<=操作数<=100000;
题解
线段树的又一个骚操作。
我们把2*2的4个点看作线段树上的叶子结点。其他节点就是其儿子的合并(叶子结点的父亲表示2*4八个点,然后是2*8,2*16)。
然后在节点上维护节点表示的点的联通信息。

信息维护六种,就是用同种颜色连接的点是否联通。
所以信息合并时要写一堆。
然后发现这样叶子节点的信息不好修改(你写写就知道了),所以我们在叶子结点上额外记录实际连边的情况。
查询大体思路是把所有点分成三分,然后枚举所有情况。(假如两个点在同一列要特判)



(这些线代表的是连通情况,并不是实际路线)
然后就可以通过了
这个题告诉我:对拍是个好东西
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int n;
struct jz{
int a[];
}hhh;
struct tree{
int l,r;
jz z,tru;
}tr[N*];
void build(int l,int r,int now){
tr[now].l=l;tr[now].r=r;
if(l==r){
return;
}
int mid=(tr[now].l+tr[now].r)>>;
build(l,mid,now*);
build(mid+,r,now*+);
}
void update(int now){
tr[now].z.a[]=(tr[now*].z.a[]&tr[now*+].z.a[])|(tr[now*].z.a[]&tr[now*+].z.a[]);
tr[now].z.a[]=(tr[now*].z.a[]&tr[now*+].z.a[])|(tr[now*].z.a[]&tr[now*+].z.a[]);
tr[now].z.a[]=(tr[now*].z.a[]&tr[now*+].z.a[])|(tr[now*].z.a[]&tr[now*+].z.a[]);
tr[now].z.a[]=(tr[now*].z.a[]&tr[now*+].z.a[])|(tr[now*].z.a[]&tr[now*+].z.a[]);
tr[now].z.a[]=tr[now*].z.a[]|(tr[now*].z.a[]&tr[now*].z.a[]&tr[now*+].z.a[]);
tr[now].z.a[]=tr[now*+].z.a[]|(tr[now*+].z.a[]&tr[now*+].z.a[]&tr[now*].z.a[]);
}
void update(int x,int k,int c,int now){
if(tr[now].l==tr[now].r){
tr[now].tru.a[k]=c;
for(int i=;i<=;i++){
tr[now].z.a[i]=tr[now].tru.a[i];
}
tr[now].z.a[]=(tr[now].tru.a[]&tr[now].tru.a[])|(tr[now].tru.a[]&tr[now].tru.a[]);
tr[now].z.a[]=(tr[now].tru.a[]&tr[now].tru.a[])|(tr[now].tru.a[]&tr[now].tru.a[]);
tr[now].z.a[]=tr[now].z.a[]|(tr[now].z.a[]&tr[now].z.a[])|(tr[now].z.a[]&tr[now].z.a[]);
tr[now].z.a[]=tr[now].z.a[]|(tr[now].z.a[]&tr[now].z.a[])|(tr[now].z.a[]&tr[now].z.a[]);
tr[now].z.a[]=tr[now].z.a[]|(tr[now].z.a[]&tr[now].z.a[])|(tr[now].z.a[]&tr[now].z.a[]);
tr[now].z.a[]=tr[now].z.a[]|(tr[now].z.a[]&tr[now].z.a[])|(tr[now].z.a[]&tr[now].z.a[]);
// for(int i=1;i<=6;i++){
// cout<<tr[now].z.a[i]<<" ";
// }
// cout<<endl;
return;
}
int mid=(tr[now].l+tr[now].r)>>;
if(x<=mid)update(x,k,c,now*);
else update(x,k,c,now*+);
update(now);
}
jz hb(jz a,jz b,jz c){
c.a[]=(a.a[]&b.a[])|(a.a[]&b.a[]);
c.a[]=(a.a[]&b.a[])|(a.a[]&b.a[]);
c.a[]=(a.a[]&b.a[])|(a.a[]&b.a[]);
c.a[]=(a.a[]&b.a[])|(a.a[]&b.a[]);
c.a[]=a.a[]|(a.a[]&a.a[]&b.a[]);
c.a[]=b.a[]|(b.a[]&b.a[]&a.a[]);
return c;
}
jz check(int l,int r,int now){
if(tr[now].l==l&&tr[now].r==r){
return tr[now].z;
}
int mid=(tr[now].l+tr[now].r)>>;
if(l>mid)return check(l,r,now*+);
else if(r<=mid)return check(l,r,now*);
else {
return hb(check(l,mid,now*),check(mid+,r,now*+),hhh);
}
}
int main(){
scanf("%d",&n);
build(,n+,);
string s;
while(cin>>s){
if(s[]=='E')break;
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(y1>y2)swap(x2,x1),swap(y1,y2);
if(s[]=='O'){
if(y1==y2){
update(y1,,,);
update(y1+,,,);
}
else {
if(x1==)update(y1+,,,);
else update(y1+,,,);
}
}
else if(s[]=='C'){
if(y1==y2){
update(y1,,,);
update(y1+,,,);
}
else {
if(x1==)update(y1+,,,);
else update(y1+,,,);
}
}
else {
if(y1==y2){
jz x=check(,y1,);
jz y=check(y1+,n+,);
if(x.a[]|y.a[])printf("Y\n");
else printf("N\n");
}
else{
jz z=check(y1+,y2,);
jz x=check(,y1,);
jz y=check(y2+,n+,);
if(x1==x2){
if(x1==){
if(z.a[]|(x.a[]&z.a[]&y.a[])|(x.a[]&z.a[])|(z.a[]&y.a[]))printf("Y\n");
else printf("N\n");
}
else if(z.a[]|(x.a[]&z.a[]&y.a[])|(x.a[]&z.a[])|(z.a[]&y.a[]))printf("Y\n");
else printf("N\n");
}
else{
if(x1==){
if(z.a[]|(x.a[]&z.a[])|(y.a[]&z.a[])|(x.a[]&z.a[]&y.a[]))printf("Y\n");
else printf("N\n");
}
else if(z.a[]|(x.a[]&z.a[])|(y.a[]&z.a[])|(x.a[]&z.a[]&y.a[]))printf("Y\n");
else printf("N\n");
}
}
}
}
return ;
}
[SHOI2008]堵塞的交通(线段树维护联通性)的更多相关文章
- BZOJ.1018.[SHOI2008]堵塞的交通(线段树维护连通性)
题目链接 只有两行,可能的路径数不多,考虑用线段树维护各种路径的连通性. 每个节点记录luru(left_up->right_up),lurd,ldru,ldrd,luld,rurd,表示这个区 ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
P4246 [SHOI2008]堵塞的交通 题意 题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个\(2\)行\(C\)列的矩形 ...
- BZOJ1018[SHOI2008]堵塞的交通——线段树
题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...
- bzoj1018/luogu4246 堵塞的交通 (线段树)
对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...
- BZOJ1018 堵塞的交通(线段树)
题目很好明白,然后实现很神奇.首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行.然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优.于是看了题解,发现了线段树的神奇用途. 我们维护 ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树
题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
随机推荐
- mount ntfs 失败解决办法
在双系统中,ntfs可能会应为windows的缓存而挂载失败.可用下面命令修复. Use ntfsfix in the terminal, even if you can't access Windo ...
- VS 2015 C#不能进入断点
工程\属性\生成页面,去掉优化代码勾选.
- html5+css3+javascript 自定义弹出窗口
效果图: 源码: 1.demo.jsp <%@ page contentType="text/html;charset=UTF-8" language="java& ...
- STL数组和com数组相互转换的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 STL的泛型数组是vetor,com的泛型数组类型是VARIANT.二者怎样能相互转化呢?就是说怎么把一个vector ...
- 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
Kruskal算法和Prim算法一样,都是求最小生成树问题的流行算法. 算法思想: Kruskal算法按照边的权值的顺序从小到大查看一遍,如果不产生圈或者重边,就把当前这条边加入到生成树中. 算法的正 ...
- 修改input标签中的placeholder样式
input::-webkit-input-placeholder { color: #fff !important; } input:-moz-placeholder { color: #fff !i ...
- swift语言点评二
一.数据类型 1.基础类型的封装 Swift provides its own versions of all fundamental C and Objective-C types, includi ...
- SpringBoot学习笔记(8)-----SpringBoot文件上传
直接上代码,上传文件的前端页面: <body> <form action="/index/upload" enctype="multipart/form ...
- 路飞学城-Python开发-第二章
''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...
- How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式
个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...