[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 ...
随机推荐
- Eclipse下载安装教程
Eclipse下载安装 Eclipse是一款开源软件,免费,实用,也应该是大多数同学接触的第一款java集成开发环境(IDE),简单介绍下下载流程 1.进入官网 百度,Bing,或谷歌搜索Eclips ...
- mybatis的sql中字段两种映射(映射到实体)方式
mybatis的xml配置文件中,字段映射的两种方式: 1.resultMap标签中将数据库的字段与实体类中的字段对应: <resultMap id="BaseResultMap&qu ...
- select2多选
在TCX_1710项目中的拒绝代码配置页面可以选择多个拒绝字段,效果图如下 代码中需要注意的有以下地方:图1为提交保存时对多选数据的获取,图2为修改是对多选数据的回显 对于多选框宽度太窄的问题,可以参 ...
- 继续ubuntu和遇到的easybcd的坑
找了很多教程,反复斟酌https://www.zhihu.com/question/34611974 个人感觉前方还有大坑无数.unbuntu四个分区系列——65%根目录,25%home目录,交换分区 ...
- C# treeview绑定
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) ...
- malloc 和free例程
#include <stdio.h>#include <stdlib.h>int main(){int a;scanf("%d",&a);int * ...
- 【转】 值得推荐的C/C++框架和库 (真的很强大)
[转] 值得推荐的C/C++框架和库 (真的很强大) 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个 ...
- Yocto tips (15): Yocto中的包管理器
使用包管理器 在local.conf中使能就可以: 然后编译后就会有rpm包了: 配置文件server 能够使用ngix和apache.可是我们也能够仅仅用使用python: python -m Si ...
- 捕捉到来自宇宙深空的神奇X-射线信号
请看下图: 这是专门用于捕捉X-射线信号的航天望远镜,约有5吨重,执行轨道距离地面大约有5万多公里.6月24日,美国宇航局NASA宣布,这台航天望远镜从银河系深处捕捉到一种波长非常特殊的神奇X-射线信 ...
- Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2 ...