题目

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. Ubuntu16.04 Mysql

    1.安装mysql root@ubuntu:~# sudo apt-get install mysql-server root@ubuntu:~# apt install mysql-client r ...

  2. C++之虚函数表

    本文引自:http://songlee24.github.io/blog/2014/09/02/c-plus-plus-jin-jie-zhi-xu-han-shu-biao/ C++通过继承(inh ...

  3. Android VelocityTracker类和Scroller类

    VelocityTracker类:用于跟踪触屏事件的速度,通常使用VelocityTracker的步骤如下: static VelocityTracker obtain():获取一个VelocityT ...

  4. 解决win8.1下sql配置iis的问题

    在配置iis8.5时,ISAPI和CGI限制中没有ASP.NET v4.0.30319, 所以要注册.net 4.0 注册方法为在“运行”中输入cmd,然后在命令行中输入: C:\WINDOWS\Mi ...

  5. http状态码304

    服务器对客户端返回HTTP/1.1 304  意思是服务端告诉客户端 我的的缓存没有改变你不需要来取了,就用你自己本地的吧! 浏览器的三种缓存协商机制: if-modified-since (基于最后 ...

  6. Debian9.5系统DHCP服务器ISC DHCP软件配置说明

    DHCP 全称Dynamic Host configuration protocol, 动态主机配置协议.是一个局域网的网络协议,使用UDP协议工作,它可以为客户机自动分配IP地址.子网掩码以及缺省网 ...

  7. vb常用的内部函数(二):字符串函数

    len(string):计算字符串长度函数.返回字符串string中字符的个数.一个汉字为一个字符,空格也为一个字符,空字符串的长度为0. Ltrim(string).Rtrim(string).Tr ...

  8. POJ-1062 昂贵的聘礼 有限制的最短路

    题目链接:https://cn.vjudge.net/problem/POJ-1062 题意 虽然是中文题,还是简单复述一下吧 我们想要酋长的女儿作为老婆.作为交换,酋长想要点钱. 酋长提出可以用其他 ...

  9. list 分页

    package com.jsz.peini.common.util; import java.util.ArrayList; import java.util.List; public class S ...

  10. 在WIN7、WIN10操作系统用WebDAV映射网络驱动器需要的操作

    如果WebDAV不是https的,win7默认是添加不上的,需要修改注册表使得WIN7同时支持http和https,默认只支持https,然后重启服务 某一服务器,配置好了WebDAV.用苹果电脑作客 ...