题目描述
有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可以被看成是一个222行 C'>CCC列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C2C2C个城市和3C−23C−23C−2条道路。
小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通,直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入膏肓的小人国交通系统。 小人国的交通部将提供一些交通信息给你,你的任务是根据当前的交通情况回答查询的问题。交通信息可以分为以下几种格式:
Close r1 c1 r2 c2Closer1c1r2c2Close\ r_1\ c_1\ r_2\ c_2:相邻的两座城市(r1,c1)(r1,c1)(r_1, c_1)和(r2,c2)(r2,c2)(r_2, c_2)之间的道路被堵塞了;
Open r1 c1 r2 c2Openr1c1r2c2Open\ r_1\ c_1\ r_2\ c_2:相邻的两座城市(r1,c1)(r1,c1)(r_1, c_1)和(r2,c2)(r2,c2)(r_2, c_2)之间的道路被疏通了;
Ask r1 c1 r2 c2Askr1c1r2c2Ask\ r_1\ c_1\ r_2\ c_2:询问城市(r1,c1)(r1,c1)(r_1, c_1)和(r2,c2)(r2,c2)(r_2, c_2)是否连通。如果存在一条路径使得这两条城市连通,则返回Y,否则返回N。
注:ririr_i表示行数,cicic_i表示列数,1≤ri≤2,1≤ci≤C1≤ri≤2,1≤ci≤C1≤ri≤2,1≤ci≤C。
输入输出格式
输入格式:

第一行只有一个整数CCC,表示网格的列数。接下来若干行,每行为一条交通信息,以单独的一行Exit作为结束。我们假设在一开始所有的道路都是堵塞的。我们保证C'>CCC小于等于100000100000100000,信息条数小于等于 100000100000100000。

输出格式:

对于每个查询,输出一个Y或N。

输入输出样例
输入样例#1:
2
Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit
输出样例#1:
Y
N
说明
数据范围:
对于100%的数据,
1≤C≤1000001≤C≤1000001≤C≤100000,1≤1≤1≤信息条数 ≤100000≤100000≤100000。

分析:我们维护只走在纵坐标为[l,r][l,r][l,r]为矩形内的边时,矩形四角的连通性。合并区间还是很好维护的,因为合并两个区间时需要midmidmid到mid+1mid+1mid+1这两条边的连通性,开一个数组记录一下就好了,具体可以看代码。
对于查询从(x,y)(x,y)(x,y)到(l,r)(l,r)(l,r)连通性,有444种情况,我们设(!x,y)'>(!x,y)(!x,y)(!x,y)为(x,y)(x,y)(x,y)在第yyy列的另一个点。
第一种是直接从[y,r]'>[y,r][y,r][y,r]内矩阵的边走过去;
第二种是先从[1,y][1,y][1,y]的矩阵从(x,y)(x,y)(x,y)走到(!x,y)(!x,y)(!x,y),然后再从[y,r][y,r][y,r]的矩阵走到(l,r)(l,r)(l,r);
第三种是从[y,r][y,r][y,r]的矩阵从(x,y)(x,y)(x,y)走到(!l,r)(!l,r)(!l,r),再从[r,n][r,n][r,n]的矩阵走到(l,r)(l,r)(l,r);
第四种是先从[1,y][1,y][1,y]的矩阵从(x,y)(x,y)(x,y)走到(!x,y)(!x,y)(!x,y),然后再从[y,r][y,r][y,r]的矩阵走到(!l,r)(!l,r)(!l,r),再从[r,n][r,n][r,n]的矩阵走到(l,r)(l,r)(l,r)。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>const int maxn=1e5+7;using namespace std;struct node{int a[4][4];int l,r;
}t[maxn*4];int n,a,b,c,d;
int g[maxn*3];
char s[10];node merge(node x,node y)
{node z;int r=x.r;z.a[0][1]=z.a[1][0]=(x.a[0][1]&g[r]&y.a[0][1])|(x.a[0][3]&g[n+r]&y.a[2][1]);z.a[0][2]=z.a[2][0]=(x.a[0][2])|(x.a[0][1]&g[r]&y.a[0][2]&g[n+r]&x.a[3][2]);z.a[0][3]=z.a[3][0]=(x.a[0][1]&g[r]&y.a[0][3])|(x.a[0][3]&g[n+r]&y.a[2][3]);z.a[1][2]=z.a[2][1]=(x.a[2][1]&g[r]&y.a[0][1])|(x.a[2][3]&g[n+r]&y.a[2][1]);z.a[1][3]=z.a[3][1]=(y.a[1][3])|(y.a[1][0]&g[r]&x.a[1][3]&g[n+r]&y.a[2][3]);z.a[2][3]=z.a[3][2]=(x.a[2][1]&g[r]&y.a[0][3])|(x.a[2][3]&g[n+r]&y.a[2][3]);z.l=x.l;z.r=y.r;return z;
}node neww(int l)
{node z;z.l=z.r=l;z.a[0][1]=z.a[1][0]=z.a[2][3]=z.a[3][2]=1;z.a[0][2]=z.a[2][0]=z.a[0][3]=z.a[3][0]=z.a[1][2]=z.a[2][1]=z.a[1][3]=z.a[3][1]=g[n*2+l];return z;
}void change(int p,int l,int r,int x,int y)
{if (l==r){t[p]=neww(l);return;}int mid=(l+r)/2;if (y<=mid) change(p*2,l,mid,x,y);else if (x>mid) change(p*2+1,mid+1,r,x,y);else{change(p*2,l,mid,x,mid);change(p*2+1,mid+1,r,mid+1,y);}t[p]=merge(t[p*2],t[p*2+1]);
}node query(int p,int l,int r,int x,int y)
{if ((l==x) && (r==y)) return t[p];int mid=(l+r)/2;if (y<=mid) return query(p*2,l,mid,x,y);else{if (x>mid) return query(p*2+1,mid+1,r,x,y);else{return merge(query(p*2,l,mid,x,mid),query(p*2+1,mid+1,r,mid+1,y));}}
}int main()
{scanf("%d",&n); while (1){scanf("%s",s);if (s[0]=='E') break;scanf("%d%d%d%d",&a,&b,&c,&d);      if (b>d) swap(a,c),swap(b,d);       if ((s[0]=='O') || (s[0]=='C')){int k;if (s[0]=='O') k=1;else k=0;if (b==d) g[n*2+b]=k;else{if (a==1) g[b]=k;else g[n+b]=k;}change(1,1,n,b,d);}if (s[0]=='A'){           node ans=query(1,1,n,b,d);node lans=query(1,1,n,1,b);node rans=query(1,1,n,d,n);int num1=a*2-2,num2=c*2-1;int flag=0;if (ans.a[num1][num2]) flag=1;if (ans.a[num1^2][num2]&lans.a[1][3]) flag=1;if (ans.a[num1][num2^2]&rans.a[0][2]) flag=1;if(ans.a[num1^2][num2^2]&lans.a[1][3]&rans.a[0][2]) flag=1;if (flag) printf("Y\n");else printf("N\n"); }}
} 

洛谷 P4246 [SHOI2008]堵塞的交通 线段树相关推荐

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

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

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

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

  3. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

  4. 【题解】洛谷P4145 花神游历各国(线段树)

    洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...

  5. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

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

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

  7. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  8. 洛谷P4839 P哥的桶 线段树+线性基

    传送门 题意:N个操作,第K个桶放一个X,查询L到R区间的桶任意数的异或最大值. P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用 1 k x 来表示P哥找了一个颜值为x的女朋友,并且 ...

  9. 洛谷P4837 养殖呆河马(线段树)

    题目描述 作为养殖场的大佬,阳阳引进了养殖呆河马的技术,而且她有一个团队来研究呆河马的养殖技巧来制定养殖规划,并在今年购入了 1 只呆河马.她们制定了从今年(即第 0 年)到第 n−1年的养殖呆河马的 ...

最新文章

  1. webDriver测试百度登录java版
  2. Aspx页面中直接编写javascript脚本
  3. Node.js 切近实战(八) 之Excel在线(文件权限)
  4. textarea里的回车和换行符与json里的回车和换行符
  5. 深度学习(25)随机梯度下降三: 激活函数的梯度
  6. 以命令方式从ftp服务器上下载和上传文件
  7. ubuntu防火墙操作
  8. CentOS7 防火墙相关命令
  9. long 雪花算法_雪花算法(snowflake)
  10. window下配置定时任务实现类似linux的cron定时任务
  11. php微信转跳浏览器代码,通用微信QQ跳转浏览器打开代码
  12. Flutter进阶第1篇: http get请求数据、post提交数据、以及渲染动态数据
  13. 合成PDF文档,合并PDF文档
  14. 批处理一键创建局域网共享文件夹或文件共享轻松访问Win系统其他电脑的共享文件命令行(纯bat代码)实用便携~
  15. 基于导向滤波的图像融合(GFF)
  16. 使用GitLab CI/CD进行自动测试和部署
  17. axure不能导出图片_Axure7.0导出图片提示内存不足,如何解决?
  18. openGL下的”橡皮筋“技术(多边形绘制)
  19. 人群计数之生成密度图
  20. vue报错 ‘Cannot find module ‘D:\nodejs\node_modules\npm\bin\npm-cli.js‘

热门文章

  1. 服务器修复oxc0000098,Win10系统无法开机0xc0000098错误怎么办_win10无法开机提示0xc0000098错误代码如何修复...
  2. html5 图片羽化,html5+webgl仿ps羽化笔刷液态动画特效
  3. 七彩虹 iGame G-ONE Plus 27寸游戏一体机 评测
  4. 目标检测中的BBox 回归损失函数-L2,smooth L1,IoU,GIoU,DIoU,CIoU,Focal-EIoU,Alpha-IoU,SIoU
  5. 系统介绍一部手机开发的全流程
  6. 坦克大战(Tank Battalion)------Java代码实现
  7. CIO:人工智能将改变企业IT
  8. 人工智能将从5大方面改变企业IT
  9. python求一组数的最大值_用python实现在一组数据中,寻找到最大数和最小数并输出最大数和最小数所在的位置...
  10. JavaScript面试题汇总