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

我们维护每个矩形四个顶点的六个变量,分别是:

g[0]:表示第一行左右端点的连通性。

g[1]:表示第二行左右端点的连通性。

g[2]:左上端点和左下端点的连通性。

g[3]:右上端点和右下端点的连通性。

g[4]:左上端点和右下端点的连通性。

g[5]:左下端点和右上端点的连通性。

这六个变量做好之后就可以合并矩形了。同样是这六个变量,合并的时候需要费点事,考虑一下各种情况。

最后需要的一点就是可能出现的特殊情况,这样的怎么办?

我们考虑全面即可,查询的时候不光查询一个区间,还需要查询两头的区间,然后判断是否会出现这种情况,就是我写的solve函数里面判断答案的后三种情况。 ——by VANE

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct node{bool g[6];};
int n;
node s[5],t[N*4];
bool m[N*4];
int calc(int x,int y){return x*(n-1)+y;}
void build(int rt,int l,int r)
{if(l==r) {t[rt]=s[0];return;}int mid=l+r>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
}
node merge(node a,node b,bool x,bool y)
{node c;c.g[0]=(a.g[0]&&x&&b.g[0])||(a.g[4]&&y&&b.g[5]);c.g[1]=(a.g[1]&&y&&b.g[1])||(a.g[5]&&x&&b.g[4]);c.g[2]=(a.g[2])||(a.g[0]&&x&&b.g[2]&&y&&a.g[1]);c.g[3]=(b.g[3])||(b.g[0]&&x&&a.g[3]&&y&&b.g[1]);c.g[4]=(a.g[0]&&x&&b.g[4])||(a.g[4]&&y&&b.g[1]);c.g[5]=(b.g[0]&&x&&a.g[5])||(b.g[5]&&y&&a.g[1]);return c;
}
void insert(int rt,int l,int r,int x,int y,int xx,int yy,bool c)
{int mid=l+r>>1;if(x==xx&&y==mid){m[calc(x,y)]=c;t[rt]=merge(t[rt<<1],t[rt<<1|1],m[calc(0,mid)],m[calc(1,mid)]);return;}else if(x!=xx&&l==r){t[rt]=s[c];return;}if(y<=mid) insert(rt<<1,l,mid,x,y,xx,yy,c);if(y>mid) insert(rt<<1|1,mid+1,r,x,y,xx,yy,c);t[rt]=merge(t[rt<<1],t[rt<<1|1],m[calc(0,mid)],m[calc(1,mid)]);
}
node query(int rt,int l,int r,int ll,int rr)
{int mid=r+l>>1;if(l>=ll&&r<=rr) return t[rt];if(rr<=mid)return query(rt<<1,l,mid,ll,rr);if(ll>mid) return query(rt<<1|1,mid+1,r,ll,rr);return merge(query(rt<<1,l,mid,ll,rr),query(rt<<1|1,mid+1,r,ll,rr),m[calc(0,mid)],m[calc(1,mid)]);
}
void solve(int x,int y,int xx,int yy)
{bool ans;s[2]=query(1,1,n,1,y);s[3]=query(1,1,n,y,yy);s[4]=query(1,1,n,yy,n);if(x==xx) ans=(s[3].g[x])||(s[2].g[3]&&s[3].g[4+x^1])||(s[4].g[2]&&s[3].g[4+x])||(s[2].g[3]&&s[4].g[2]&&s[3].g[x^1]);else ans=(s[3].g[4+x])||(s[2].g[3]&&s[3].g[x^1])||(s[4].g[2]&&s[3].g[x])||(s[2].g[3]&&s[3].g[4+x^1]&&s[4].g[2]);if(ans) puts("Y");else puts("N");}
int main()
{scanf("%d",&n);s[0]=(node){1,1,0,0,0,0};s[1]=(node){1,1,1,1,1,1};memset(t,0,sizeof t);memset(m,0,sizeof m);build(1,1,n);char ch[6];scanf("%s",ch);while(ch[0]!='E'){int x,y,xx,yy;scanf("%d%d%d%d",&x,&y,&xx,&yy);if(y>yy) swap(x,xx),swap(y,yy);x--;xx--;if(ch[0]=='O') insert(1,1,n,x,y,xx,yy,1);else if(ch[0]=='C') insert(1,1,n,x,y,xx,yy,0);else solve(x,y,xx,yy);scanf("%s",ch);}
}

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8287935.html

BZOJ1018 堵塞的交通(线段树)相关推荐

  1. [BZOJ1018]SHOI2008堵塞的交通|线段树

    好神的线段树题,以前只会维护区间什么数值信息的,竟然还可以维护联通性,好题啊,涨姿势了.. 由于只有两行嘛,要保证线段树节点有可加性,我们维护六个信息,分别是右上到右下,右上到左上,右上到左下,右下到 ...

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

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

  3. 洛谷 P4246 [SHOI2008]堵塞的交通 线段树

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

  4. Bzoj1018[SHOI2008]堵塞的交通traffic(线段树)

    这题需要维护连通性,看到有连接删除,很容易直接就想LCT了.然而这题点数20w操作10w,LCT卡常估计过不去.看到这个东西只有两行,考虑能否用魔改后的线性数据结构去维护.我想到了线段树. 考虑如果两 ...

  5. BZOJ1018 | SHOI2008-堵塞的交通traffic——线段树维护区间连通性+细节

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

  6. BZOJ[1018][SHOI2008]堵塞的交通traffic 线段树

    传送门ber~ 哇这个线段树好神啊!! 用线段树维护图连通性,每个节点开个二维数组 ai,j a i , j a_{i,j}表示这个区间最左面的第 i i i行能不能走到最右面的第j" ro ...

  7. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  8. BZOJ1018 [SHOI2008] 堵塞的交通traffic

    @(BZOJ)[线段树] Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个\(2\)行\(C\)列的矩形网格,网 ...

  9. bzoj1018[SHOI2008]堵塞的交通traffic

    题目链接:bzoj1018 题目大意: 一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路. 交通信息可以分为以下几种格式: Close ...

最新文章

  1. [react] 说说你对windowing的了解
  2. 置顶图片代码加链接html,css图片怎么加链接?
  3. 31 SD配置-主数据-信用管理-定义自动信贷控制
  4. python爬虫之request_Python爬虫:Scrapy研读之Request/Reponse
  5. Deep Learning for 3D Recognition
  6. Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
  7. jQuery动画stop()用法
  8. 弹出“FRM-40400:事务完成:已应用和保存X条记录
  9. 生产用计算机房噪音应小于,机房建设规范标准要求
  10. (一)NanoPi m4v2 安装 Home Assistant(含 supervisor)
  11. PM如何写好产品需求文档
  12. 同账号下阿里云ecs克隆——通过镜像更换系统
  13. 马云:阿里巴巴的最高机密是我们的组织架构图
  14. LoadRunner 自动登录163邮箱
  15. 用python爬取网站_「自如网」关于用python爬取自如网信息的价格问题(已解决) - seo实验室...
  16. 中国移动清退3G进行时
  17. oracle 物化视图没效果,物化视图失效的几种情况及测试
  18. 中科院计算所培训中心 ---2014年三季度课程安排
  19. pandas python groupby_python – 如何在Pandas groupby之后获得多个条件操作?
  20. excel导入mysql并批量查询_Excel导入MySql数据库批量操作

热门文章

  1. androidstudio 评论栏_android-studio 添加没有菜单栏和actionBar的模板
  2. java.lang.NoClassDefFoundError: javax/mail/internet/AddressException解决
  3. @Pathvariable的参数允许为空的问题的解决
  4. JVM 可设置最大内存
  5. python 装饰器相关 从后往前看
  6. 【Spark Summit EU 2016】Spark的性能,过去、现在与未来
  7. 【python】python的二元表达式和三元表达式
  8. 从尿检取中段谈数据库压测
  9. CEF js调用C#封装类含注释
  10. 常见问题一:Ext.Net的缓存与session值在当前页总是不变