题目

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]堵塞的交通(线段树维护联通性)的更多相关文章

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

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

  2. [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

    题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...

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

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

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

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

  5. bzoj1018/luogu4246 堵塞的交通 (线段树)

    对于一个区间四个角的点,可以用线段树记下来它们两两的联通情况 区间[l,r]通过两个子区间[l,m],[m+1,r]来更新,相当于合并[l,m],[m+1,r],用(m,m+1)这条边来合并 查询a, ...

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

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

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

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

  8. [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树

    题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...

  9. BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3064  Solved: 1027[Submi ...

随机推荐

  1. js捕获页面回车事件

    1.javascript版 document.onkeyup = function (e) { if (window.event)//如果window.event对象存在,就以此事件对象为准 e = ...

  2. JS的数据类型(包含:7种数据类型的介绍、数据类型的转换、数据类型的判断)

    前言 最新的 ECMAScript 标准定义了JS的 7 种数据类型,其中包括: 6 种基本类型:Boolean.Null.Undefined.Number.String.Symbol (ECMASc ...

  3. 中文版 R-FCN: Object Detection via Region-based Fully Convolutional Networks

    R-FCN: Object Detection via Region-based Fully Convolutional Networks 摘要 我们提出了基于区域的全卷积网络,以实现准确和高效的目标 ...

  4. (转载)Android自定义ProgressDialog进度等待框

    Android自定义ProgressDialog进度等待框 作者:无缘公子 字体:[增加 减小] 类型:转载 时间:2016-01-11我要评论 这篇文章主要介绍了Android自定义Progress ...

  5. proxy in java

    [Static] IFeature.java ImpicateF.java Runport.java StaticProxy.java IFeature.java package UProxy.sta ...

  6. Glidar测试安装

    在上一篇随笔中,我们完成了对Glidar 仿真器的概念层面的认识.接下来,我们将着手对该该仿真器进行安装测试. 1 依赖库的安装 安装环境为Windows 7 64位+Ubuntu14.04 LTS的 ...

  7. HDU 1312 Red and Black【DFS】

    搜索虐我千万遍@_@-----一道搜索的水题,WA了好多好多次@_@发现是n,m搞反了-_- 题意-- 给出m行 n列的矩形,其中从@出发,不能跳到#,只能跳到'.'问最多能够跳到多少块'.' 直接搜 ...

  8. php nusoap类的使用、用法、出错 及说明

    NuSOAP 是 PHP 环境下的 WEB 服务编程工具,用于创建或调用 WEB 服务它是一个开源软件,当前版本是 0.7.2 ,支 持 SOAP1.1 WSDL1.1 ,可以与其他支持 SOAP1. ...

  9. 【Paper Reading】Object Recognition from Scale-Invariant Features

    Paper: Object Recognition from Scale-Invariant Features Sorce: http://www.cs.ubc.ca/~lowe/papers/icc ...

  10. Linux 程序包管理-RPM

    程序简介:  POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译 ...