题目

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. Kettle的概念学习系列之Kettle是什么?(一)

    不多说,直接上干货! Kettle是什么? Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文 ...

  2. VS2012数据绑定控件DataGridView和DataGrid

    在做Windows窗体上ADO.NET数据绑定试验的时候,发现实例中提到的一些控件在vs2012的工具箱中找不到,开始以为是工具箱中的控件太多没看到,结果重新找还是没找到,难道是因为控件升级了?yes ...

  3. [SCOI2009]windy数 数位dp

    Code: #include<cmath> #include<iostream> #include<cstdio> using namespace std; con ...

  4. laravel 5.5 项目报错

    报错内容: ErrorException (E_WARNING) Declaration of App\Observers\SiteObserver::updated($site) should be ...

  5. Hadoop2.x 关于日志文件位置

    查看日志是发现Hadoop问题和解决Hadoop问题的第一步. 开始我不知道该去哪找日志,后来我发现在我启动节点的时候,有打印信息以及明确告诉了日志写在哪. [root@master hadoop]# ...

  6. CSS核心原理

    1.优先原则: 后解析的内容,会覆盖掉之前解析的内容: 同一个选择器:文件执行从上往下,后面的样式会覆盖前面的: 如下例中color最终为粉色: div { color:red; color:pink ...

  7. bootstrap 因跳页黑色背景无法关闭

    只需要在跳页之前加上如下代码: $(".modal-backdrop").remove();

  8. 如何绑定host

    绑定host一般分为windows和linux下两种情况. windows下,首先打开host文件,其操作步骤 ,打开 C:\Windows\System32\Drivers\etc\hosts的文件 ...

  9. Docker之Mysql安装及配置

    原文:Docker之Mysql安装及配置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhaobw831/article/details/8014 ...

  10. POJ——T2553 The Bottom of a Graph

    http://poj.org/problem?id=2553 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10987   ...