@(BZOJ)[线段树]

Description

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

Input

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

Output

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

Sample Input

Open 1 1 1 2
Open 1 2 2 2
Ask 1 1 2 2
Ask 2 1 2 2
Exit

Sample Output

Y
N

Solution

這一題還是很難想的, 用的是線段樹維護連通性.

经过分析, \((r1,c1)\)\(\to\)\((r2,c2)\)一共有四种方式。

  1. 直接过去。
  2. 先到\((0,c1)\)再过去。
  3. 先到\((1,c2)\)再过去。
  4. 先到\((0,c1)\)再到\((1,c2)\)再过去。
    用一个数组\(a1[i][j]\),表示x节点维护的区间最左端的第i行能否从区间内部通行到最右端的第j行;
    另一个数组\(a2[i]\),\(a2[0]\)记录x节点维护的区间中最坐端的点能不能从区间内部绕到另外一行, \(a2[1]\)记录最右端的点能不能从区间内部绕到另外一行.

大概就是这样吧, 然后合并两个节点的操作会比较奇怪, 可以直接看代码.

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
inline void read(int &x)
{x = 0;int flag = 1;char c;while(! isdigit(c = getchar()))if(c == '-')flag *= - 1;while(isdigit(c))x = x * 10 + c - '0', c = getchar();x *= flag;
}
inline void read(char *s)
{char c;while(! isgraph(c = getchar()));int len = 0;while(isgraph(c))s[len ++] = c, c = getchar();
}
void println(int x)
{if(x < 0)putchar('-'), x *= - 1;if(x == 0)putchar('0');int ans[10 + (1 << 4)], top = 0;while(x)ans[top ++] = x % 10, x /= 10;for(; top; top --)putchar(ans[top - 1] + '0');putchar('\n');
}
const int C = 1 << 17;
int c;
struct Node
{int a1[2][2], a2[2];
}T[C << 2];
int b[C << 2][2];
void Build(int u, int L, int R)
{for(int i = 0; i < 2; i ++)for(int j = 0; j < 2; j ++)T[u].a1[i][j] = T[u].a2[i] = 0;if(L == R)T[u].a1[0][0] = T[u].a1[1][1] = 1;int mid = L + R >> 1;if(L < R)Build(u << 1, L, mid), Build(u << 1 ^ 1, mid + 1, R);
}
Node Update(Node x1, Node x2, int b[])
{Node ret;for(int i = 0; i < 2; i ++) for(int j = 0; j < 2; j ++) ret.a1[i][j] = x1.a1[i][0] && b[0] && x2.a1[0][j] || x1.a1[i][1] && b[1] && x2.a1[1][j];ret.a2[0]=x1.a2[0] || x1.a1[0][0] && b[0] && x2.a2[0] && b[1] && x1.a1[1][1];ret.a2[1]=x2.a2[1] || x2.a1[0][0] && b[0] && x1.a2[1] && b[1] && x2.a1[1][1];    return ret;
}
void Change(int k, int u, int L, int R, int r1, int c1, int r2, int c2)
{if(r1 == r2 && c1 == L + R >> 1)b[u][r1] = k, T[u] = Update(T[u << 1], T[u << 1 | 1], b[u]);else if(L == R)T[u].a1[0][1] = T[u].a1[1][0] = T[u].a2[0] = T[u].a2[1] = k;else{int mid = L + R >> 1;if(c2 <= mid)Change(k, u << 1, L, mid, r1, c1, r2, c2);elseChange(k, u << 1 | 1, mid + 1, R, r1, c1, r2, c2);T[u] = Update(T[u << 1], T[u << 1 | 1], b[u]);}
}
Node Access(int u, int L, int R, int c1, int c2)
{int mid = L + R >> 1;if(L >= c1 && R <= c2)return T[u];if(c2 <= mid)return Access(u << 1, L, mid, c1, c2);else if (c1 > mid)return Access(u << 1 | 1, mid + 1, R, c1, c2);elsereturn Update(Access(u << 1, L, mid, c1, c2), Access(u << 1 | 1, mid + 1, R, c1, c2), b[u]);
}
void Ask(int r1, int c1, int r2, int c2)
{Node Left = Access(1, 1, c, 1, c1), Right = Access(1, 1, c, c2, c), Mid = Access(1, 1, c, c1, c2);int ret = 0;for(int i = 0; i < 2; i ++)for(int j = 0; j < 2; j ++)if(Mid.a1[i][j] && (i == r1 || Left.a2[1]) && (j == r2 || Right.a2[0])){ret = 1;break;}putchar(ret ? 'Y' : 'N');putchar('\n');
}
int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ1018.in", "r", stdin);freopen("BZOJ1018.out", "w", stdout);#endifread(c);char opt[1 << 4];Build(1, 1, c);while(1){read(opt);if(opt[0] == 'E')return 0;int r1, c1, r2, c2;read(r1), read(c1), read(r2), read(c2);if(c1 > c2)swap(r1, r2), swap(c1, c2);if(opt[0] == 'O')Change(1, 1, 1, c, r1 - 1, c1, r2 - 1, c2);else if(opt[0] == 'C')Change(0, 1, 1, c, r1 - 1, c1, r2 - 1, c2);elseAsk(r1 - 1, c1, r2 - 1, c2);}
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/6427655.html

BZOJ1018 [SHOI2008] 堵塞的交通traffic相关推荐

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

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

  2. Bzoj1018 [SHOI2008]堵塞的交通traffic

    Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3458  Solved: 1158 Description 有一天,由于某种穿越现象作用,你来到了传说 ...

  3. BZOJ1018: [SHOI2008]堵塞的交通traffic

    线段树维护每一块左上到左下.右上到右下.左上到右上.左下到右下.左上到右下.左下到右上的联通情况. upd:可以直接用3082的方法搞,能过. #include<bits/stdc++.h> ...

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

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

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic

    二次联通门 : BZOJ 1018: [SHOI2008]堵塞的交通traffic /*BZOJ 1018: [SHOI2008]堵塞的交通traffic麻麻这题玩我这题简直消磨人的意志写了一天了写一 ...

  6. [bzoj1018] [SHOI2008]堵塞的交通

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

  7. [SHOI2008]堵塞的交通traffic

    线段树维护连通性... 通过分析我们可以发现,一个城市到另一个城市一共只有很少的几种情况 所以我们可以维护这个 2*X 矩形 判断其 从左上角到左下角 左上角到右上角 左上角到右下角 左下角到右上角 ...

  8. 【BZOJ】1018: [SHOI2008]堵塞的交通traffic

    http://www.lydsy.com/JudgeOnline/problem.php?id=1018 题意:有2行,每行有c(c<=100000)个城市,则一共有c-1个格子,现在有q(q& ...

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

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

最新文章

  1. hive指定多个字符作为列分隔符的问题说明
  2. Java-ThreadLocal三种使用场景
  3. python中change的用法_vue中select的使用、默认选择、onchange/change事件等操作实例
  4. linux用dd测试磁盘速度
  5. CodeForces - 1358C Celex Update(思维)
  6. 加快网站访问速度--jquery.js
  7. Java中带有JWebSocket的WebServerSocket
  8. mootools框架【十】-mootools深层探讨
  9. pythonb超分辨成像_深度原理与框架-图像超分辨重构-tensorlayer
  10. 安卓逆向_15( 二 ) --- Android Studio 3.6.3 JNI 环境配置 和 so 生成开发 demo
  11. H264--H264解码--5
  12. qt 展开指定目录_Qt5实战003:Qt Creator工程目录浅析
  13. javascript 数组所有方法
  14. 【电子商务安全与支付实验】数字证书的申请及使用
  15. 上班摸鱼的模拟经营文字游戏(管理后台页面,老板都看不出来)
  16. matlab实现卷积编码与viterbi译码
  17. python植物大战僵尸 豆约翰_python植物大战僵尸十四之采集太阳(太阳不是同时产生)...
  18. 暴力破解压缩包原理及方法
  19. 西电计算机学院嵌入式所,祝贺计算机科学与技术学院张亮老师团队论文被顶级期刊TNNLS录取...
  20. android仿iphone日期时间选择器,jquery仿苹果的时间/日期选择效果

热门文章

  1. 路由器中关于包转发率概念的理解
  2. 购买腾讯云服务器-云服务器(1)
  3. 一图看懂什么是区块链
  4. 小程序代理商是如何赚钱的?
  5. Linux的安全扫描Nikto安装
  6. JavaEE笔记(基础):1.2环境变量配置
  7. English Learning - L2 语音作业打卡 辅音唇齿音 [f] [v] Day28 2023.3.20 周一
  8. vue组件mounted中window.onresize无效
  9. 在线部署kubeedge 1.6详细教程(Ubuntu)
  10. FaceNet论文翻译