1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic
分析:
用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可。
六种情况左上到右上(左边到右边的情况)……,左上到左下(同一侧相互到达的情况)……
同一侧相互到达的情况,查询[l,r]是查的不完全。因为还有可能是先往左边走几步,下去,在走回来。这时候,查询一下[1,l]的情况,或起来即可。
代码:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<iostream>
- #include<cctype>
- #include<set>
- #include<vector>
- #include<queue>
- #include<map>
- #define fi(s) freopen(s,"r",stdin);
- #define fo(s) freopen(s,"w",stdout);
- using namespace std;
- typedef long long LL;
- inline int read() {
- int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
- for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
- }
- #define Root 1, n, 1
- #define lson l, mid, rt << 1
- #define rson mid + 1, r, rt << 1 | 1
- const int N = ;
- struct Node{
- bool l, r, s, x, a, b, t[];
- Node () {l = r = s = x = a = b = t[] = t[] = ; }
- }T[N << ];
- int n, A1, A2, B1, B2;
- Node operator + (const Node &p, const Node &q) {
- Node ans;
- ans.t[] = q.t[], ans.t[] = q.t[];
- if (p.l || (p.s && p.t[] && q.l && p.t[] && p.x)) ans.l = ;
- if (q.r || (q.s && p.t[] && p.r && p.t[] && q.x)) ans.r = ;
- if ((p.s && p.t[] && q.s) || (p.b && p.t[] && q.a)) ans.s = ;
- if ((p.x && p.t[] && q.x) || (p.a && p.t[] && q.b)) ans.x = ;
- if ((p.x && p.t[] && q.a) || (p.a && p.t[] && q.s)) ans.a = ;
- if ((p.s && p.t[] && q.b) || (p.b && p.t[] && q.x)) ans.b = ;
- return ans;
- }
- void build(int l,int r,int rt) {
- if (l == r) {
- T[rt].s = T[rt].x = ; return ;
- }
- int mid = (l + r) >> ;
- build(lson); build(rson);
- T[rt] = T[rt << ] + T[rt << | ];
- }
- void update1(int l,int r,int rt,int p,int opt) {
- if (l == r) {
- T[rt].t[A1 - ] = opt; return;
- }
- int mid = (l + r) >> ;
- if (p <= mid) update1(lson, p, opt);
- else update1(rson, p, opt);
- T[rt] = T[rt << ] + T[rt << | ];
- }
- void update2(int l,int r,int rt,int p,int opt) {
- if (l == r) {
- T[rt].l = T[rt].r = T[rt].a = T[rt].b = opt;
- return ;
- }
- int mid = (l + r) >> ;
- if (p <= mid) update2(lson, p, opt);
- else update2(rson, p, opt);
- T[rt] = T[rt << ] + T[rt << | ];
- }
- Node query(int l,int r,int rt,int L,int R) {
- if (L <= l && r <= R) {
- return T[rt];
- }
- int mid = (l + r) >> ;
- if (L > mid) return query(rson, L, R); // 注意这里的返回值,不能直接用一个ans来加
- else if (R <= mid) return query(lson, L, R);
- else return query(lson, L, R) + query(rson, L, R);
- }
- bool solve() {
- int L = query(Root, , B1).r;
- int R = query(Root, B2, n).l;
- Node now = query(Root, B1, B2);
- if (A1 == A2) {
- if ((A1 == ) && (now.s || (L && now.a) || (now.b && R) || (L && now.x && R))) return ; // A1的判断!!!
- if ((A1 == ) && (now.x || (L && now.b) || (now.a && R) || (L && now.s && R))) return ;
- } else {
- if ((A1 == ) && (now.b || (now.s && R) || (L && now.x) || (L && now.a && R))) return ;
- if ((A1 == ) && (now.a || (now.x && R) || (L && now.s) || (L && now.b && R))) return ;
- }
- return ;
- }
- int main() {
- n = read(); char opt[];
- build(Root);
- while (true) {
- scanf("%s", opt);
- if (opt[] == 'E') break;
- A1 = read(), B1 = read(), A2 = read(), B2 = read();
- if (B1 > B2) swap(A1, A2), swap(B1, B2);
- if (opt[] == 'A') puts(solve() ? "Y" : "N");
- else {
- if (B1 != B2) update1(Root, B1, opt[] == 'O' ? : );
- else update2(Root, B1, opt[] == 'O' ? : );
- }
- }
- return ;
- }
1018: [SHOI2008]堵塞的交通traffic的更多相关文章
- 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 864 Descri ...
- BZOJ 1018 [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2247 Solved: 706[Submit ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3064 Solved: 1027[Submi ...
- 1018: [SHOI2008]堵塞的交通traffic - BZOJ
Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一 ...
- 【BZOJ】1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...
- [BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】
题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 用线段树维护区间连通性,对于每一个区间记录6个域表示(左上,左下)(左上,右上)(右上, ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
随机推荐
- antlr-2.7.6.jar的作用
项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误
- BZOJ 1050 旅行comf 并查集+枚举下界
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 题目大意: 给你一个无向图,N(N<=500)个顶点, M(M<=5 ...
- 关于使用Filter降低Lucene tf idf打分计算的调研
将query改成filter,lucene中有个QueryWrapperFilter性能比较差,所以基本上都须要自己写filter.包含TermFilter,ExactPhraseFilter,Con ...
- 巧用DNSlog实现无回显注入
测试一些网站的时候,一些注入都是无回显的,我们可以写脚本来进行盲注,但有些网站会ban掉我们的ip,这样我们可以通过设置ip代理池解决, 但是盲注往往效率很低,所以产生了DNSlog注入.具体原理如下 ...
- xmppframework 简介
XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开 ...
- vlc源码分析(三) 调用live555接收RTSP数据
首先了解RTSP/RTP/RTCP相关概念,尤其是了解RTP协议:RTP与RTCP协议介绍(转载). vlc使用模块加载机制调用live555,调用live555的文件是live555.cpp. 一. ...
- Gradle Goodness: Renaming Files while Copying
With the Gradle copy task we can define renaming rules for the files that are copied. We use the ren ...
- 在Red Hat Enterprise Linux 7.3上安装SQL Server 2017
必要条件: 1.在此快速安装过程中,您需要安装SQL Server 2017或SQL Server 2019上Red Hat Enterprise Linux (RHEL) 7.3 +.然后使用sql ...
- BUAA OO 2019 第二单元作业总结
目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...
- Vector/Push_back
https://bbs.csdn.net/topics/370225285 https://blog.csdn.net/u013630349/article/details/46853297 http ...