【BZOJ 1018】【SHOI 2008】堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018
线段树维护连通性。
把每一列看成一个节点,对于线段树上的每一个节点,维护8个信息,前6个字面意思很好理解,sd0和sd1分别代表这个节点所代表的列区间的最右端再往右的第1/2行是否有道路连出去。
注意一个节点上的信息表示只用这个节点所代表区间内的边是否连通,这样单点修改后再维护一下信息是可行的。
对于询问,因为每个节点维护的信息只是区间内部的边的连通性,所以要查询\(\left[1,c_1\right],\left[c_1,c_2\right],\left[c_2,n\right],c_1\leq c_2\) 3个区间的连通性,暴力分类讨论一下就可以了。
注意分类讨论一定要全面qwq,尤其是不在\(\left[c_1,c_2\right]\)内的边对左右端点的列的上下两行的连通性造成干扰时,\(\left[c_1,c_2\right]\)内的连通性受到的影响非常大,就需要十分严格的分类讨论。
时间复杂度\(O(n\log n)\)。
我的常数好大啊qwq
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100003;
struct node {
bool luru, lurd, ldru, ldrd, luld, rurd, sd0, sd1;
void clear() {luru = lurd = ldru = ldrd = luld = rurd = sd0 = sd1 = false;}
void init() {luru = ldrd = sd0 = sd1 = true;}
void copy(node *r) {luru = r->luru; lurd = r->lurd; ldru = r->ldru; ldrd = r->ldrd; luld = r->luld; rurd = r->rurd; sd0 = r->sd0; sd1 = r->sd1;}
} T[N << 2], q1, q2, q3, q4;
int n, r1, c1, r2, c2;
void pushup(node *r, node *c0, node *c1) {
r->sd0 = c1->sd0; r->sd1 = c1->sd1;
r->luru = (c0->luru && c1->luru && c0->sd0 || c0->lurd && c1->ldru && c0->sd1);
r->lurd = (c0->luru && c1->lurd && c0->sd0 || c0->lurd && c1->ldrd && c0->sd1);
r->ldru = (c0->ldru && c1->luru && c0->sd0 || c0->ldrd && c1->ldru && c0->sd1);
r->ldrd = (c0->ldru && c1->lurd && c0->sd0 || c0->ldrd && c1->ldrd && c0->sd1);
r->luld = (c0->luld || c0->sd0 && c0->sd1 && c0->luru && c0->ldrd && c1->luld);
r->rurd = (c1->rurd || c0->sd0 && c0->sd1 && c1->luru && c1->ldrd && c0->rurd);
}
void BuildTree(int rt, int l, int r) {
if (l == r) {T[rt].luru = T[rt].ldrd = true; return;}
int mid = (l + r) >> 1;
BuildTree(rt << 1, l, mid);
BuildTree(rt << 1 | 1, mid + 1, r);
pushup(T + rt, T + (rt << 1), T + (rt << 1 | 1));
}
void update(int rt, int l, int r, int pos, int flag) {
if (l == r) {
switch (flag) {
case -3: T[rt].luld = T[rt].rurd = T[rt].lurd = T[rt].ldru = false; break;
case 3: T[rt].luld = T[rt].rurd = T[rt].lurd = T[rt].ldru = true; break;
case -2: T[rt].sd1 = false; break;
case -1: T[rt].sd0 = false; break;
case 2: T[rt].sd1 = true; break;
case 1: T[rt].sd0 = true; break;
}
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update(rt << 1, l, mid, pos, flag);
else update(rt << 1 | 1, mid + 1, r, pos, flag);
pushup(T + rt, T + (rt << 1), T + (rt << 1 | 1));
}
void merge(int rt, int l, int r, int L, int R, node *rr) {
if (L <= l && r <= R) {pushup(&q4, rr, T + rt); rr->copy(&q4); return;}
int mid = (l + r) >> 1;
if (L <= mid) merge(rt << 1, l, mid, L, R, rr);
if (R > mid) merge(rt << 1 | 1, mid + 1, r, L, R, rr);
}
bool check() {
if (c1 > c2) {swap(r1, r2); swap(c1, c2);}
q1.clear(); q2.clear(); q3.clear();
q1.init(); q2.init(); q3.init();
merge(1, 1, n, 1, c1, &q1);
merge(1, 1, n, c1, c2, &q2);
merge(1, 1, n, c2, n, &q3);
if (q1.rurd) q2.luld = true; if (q3.luld) q2.rurd = true;
if (q2.luld && q2.ldru || q2.rurd && q2.lurd || q2.luld && q2.rurd && q2.ldrd) q2.luru = true;
if (q2.luld && q2.lurd || q2.rurd && q2.ldru || q2.luld && q2.rurd && q2.luru) q2.ldrd = true;
if (q2.luld && q2.ldrd || q2.rurd && q2.luru || q2.luld && q2.rurd && q2.ldru) q2.lurd = true;
if (q2.luld && q2.luru || q2.rurd && q2.ldrd || q2.luld && q2.rurd && q2.lurd) q2.ldru = true;
if (r1 == 1 && r2 == 1) return q2.luru;
if (r1 == 1 && r2 == 2) return q2.lurd;
if (r1 == 2 && r2 == 1) return q2.ldru;
if (r1 == 2 && r2 == 2) return q2.ldrd;
}
char op[23];
int main() {
scanf("%d", &n);
BuildTree(1, 1, n);
int tt = 0;
while (true) {
scanf("%s", op);
if (op[0] == 'E') break;
scanf("%d%d%d%d", &r1, &c1, &r2, &c2);
switch (op[0]) {
case 'C':
if (c1 == c2) update(1, 1, n, c1, -3);
else update(1, 1, n, min(c1, c2), -r1);
break;
case 'O':
if (c1 == c2) update(1, 1, n, c1, 3);
else update(1, 1, n, min(c1, c2), r1);
break;
case 'A':
puts(check() ? "Y" : "N");
break;
}
}
return 0;
}
【BZOJ 1018】【SHOI 2008】堵塞的交通traffic的更多相关文章
- 【BZOJ 1018】 [SHOI2008]堵塞的交通traffic
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1018 [题意] [题解] 按照这里的题解写的http://blog.csdn.net/ ...
- 【BZOJ】【1018】【SHOI2008】堵塞的交通traffic
线段树 这题的线段树+分类讨论蛮神奇的……我以前学的线段树简直就是渣渣QAQ 看了下ydc题解里的思想>_>用线段树维护连通性!那么就自己写吧……每个节点表示一段区间的连通性(我的叶子节点 ...
- 数据结构(线段树):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 ...
- bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
http://www.lydsy.com/JudgeOnline/problem.php?id=1018 关键点在于只有两行 所以一个2*m矩形连通情况只有6种 编号即对应代码中的a数组 线段树维护 ...
- 1018: [SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...
- 【bzoj1018】[SHOI2008]堵塞的交通traffic
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2887 Solved: 954[Submit ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
随机推荐
- Java程序运行时的几个区域
Java运行时涉及到的区域 几个基本概念: 1.Java对象 2.Java方法 3.一个编译好的类,以class文件的形式出现 4.Java的本地方法 5.线程私有和线程共有 一 ...
- 【bzoj3476-懒惰的奶牛】线段树
题解: 感觉这题和别人的做法不一样...呵呵呵...调了一百年.. 设家坐标为(a,b),对于每个点(x,y),可以转化为|a-x|+|b-y|<=k 对于每个点,它的影响范围是一个菱形(也就是 ...
- 【BZOJ】1914: [Usaco2010 OPen]Triangle Counting 数三角形
[题意]给定坐标系上n个点,求能构成的包含原点的三角形个数,n<=10^5. [算法]极角排序 [题解]补集思想,三角形个数为C(n,3)-不含原点三角形. 将所有点极角排序. 对于一个点和原点 ...
- 【51NOD-0】1046 A^B Mod C
[算法]快速幂运算 [题解]快速幂的原理是把幂用二进制表示,从最低位a,次低位a2,次次低位(a2)2. #include<cstdio> long long quick_pow(long ...
- Spring总结以及在面试中的一些问题(山东数漫江湖)
1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...
- [IOS]Xcode各版本官方下载及百度云盘下载, Mac和IOS及Xcode版本历史
官方下载, 用开发者账户登录,建议用Safari浏览器下载. 官方下载地址: https://developer.apple.com/xcode/downloads/ 百度云盘下载地址 http:// ...
- 【HNOI】d 最小割
[题目大意]给定一个n*m的土地,每块可以种a或b作物,每种作物在不同的位置有不同的收成,同时,有q个子矩阵中,全部种指定的作物(a或b)会有一定的加成收成,求最大收成. [数据范围] 50% n,m ...
- lnmp、lamp、lnmpa一键安装包(Updated: 2016-4-12)
lnmp.lamp.lnmpa一键安装包(Updated: 2016-4-12) 文章目录 脚本特性 安装步骤 如何添加虚拟主机? 如何删除虚拟主机? 如何管理ftp账号? 数据备份 如何管理服务 ...
- Angular2.0 基础: 环境搭建
最近在学习Angular2的使用,其实看过Angular2 文档的都知道,相比于之前的Angular1,Angular2 的改动还是挺大的. 而对于‘angular2 的本地开发环境的搭建的中,我们首 ...
- 【shell】shell中各种括号的作用()、(())、[]、[[]]、{}
一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...