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

【题目描述】
BZOJ1018 | SHOI2008-堵塞的交通traffic

 有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可
以被看成是一个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

2
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

【题目分析】
啊啊啊,我终于在题解的帮助下做出这道有(e)(e)(e)(xin)(xin)(xin)(ren)(ren)(ren)的题啦,之前看都不想看这道题,可是没有办法只能耐着性子看网上的题解,可是题解我觉得他们都觉得自己讲的挺详细,可是我看完还是一脸懵逼,又不想看代码。找来找去找了一个代码看起来挺好看的一个博客耐着性子看完后才算是大概理解了。
题目的意思应该挺好理解,不过需要注意的是题目中说修改的城市都是相邻的!!!我刚开始一直没有注意这个,觉得这个题没法做。
还是区间问题,要用万能的线段树解决的话,主要的问题是维护什么,不同于一般的线段树问题大都是一维的,这个问题是二维的,虽然只有两行,但是显然不是以前简单的区间就可以的。我们要维护的是矩形区间,叶子节点是一列两行的没有宽度的矩形,我们对于每个矩形维护四条边和两条对角线来记录矩形四个点之间的连通性关系。但是如果我们合并两个相邻的矩形,他们之间还有两条边,因此我们专门用一个数组来记录每列之间两条边的关系和上下两个城市的连通性。我们不妨记这个数组为LinkLinkLinkLink[i][0][0]Link[i][0][0]Link[i][0][0]对应第i列和i+1列第一行之间的连通性,Link[i][1][1]Link[i][1][1]Link[i][1][1]对应第i列和i+1列第二行之间的连通性,Link[i][0][1]Link[i][0][1]Link[i][0][1]对应第i列第一行与第二行之间的连通性。
然后我们用线段树维护区间的方法维护整个区间,修改两个城市之间的关系的时候先修改Link数组,然后根据Link数组单点修改。对于每次查询操作,我们分别得到[1,c1],[c1,c2],[c2,n][1,c1],[c1,c2],[c2,n][1,c1],[c1,c2],[c2,n]三个区间的矩形(用一个区间查询),然后根据这三个区间进行操作。
具体的看代码吧,嘿嘿嘿(露出了善(xie)(xie)(xie)(e)(e)(e))的微笑。
照着大佬的博客敲都wa了四发,呜呜呜。线段树忘记开区间*4了,然后还有一个数字写错了。
【参考博客】
传送门
【AC代码】

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
struct node
{int a1,a2,b1,b2,c1,c2;void init(){a1=a2=b1=b2=c1=c2=0;}
}mp[MAXN<<2];
int Link[MAXN][2][2];
int n; char cmd[10];
int r1,c1,r2,c2;node PushUp(node a,node b,int mid)
{node c;if(a.a1 || (a.b1&&Link[mid][0][0]&&b.a1&&Link[mid][1][1]&&a.b2))c.a1=1;else c.a1=0;if(b.a2 || (b.b1&&Link[mid][0][0]&&a.a2&&Link[mid][1][1]&&b.b2))c.a2=1;elsec.a2=0;if((a.b1&&Link[mid][0][0]&&b.b1) || (a.c1&&Link[mid][1][1]&&b.c2))c.b1=1;elsec.b1=0;if((a.b2&&Link[mid][1][1]&&b.b2) || (a.c2&&Link[mid][0][0]&&b.c1))c.b2=1;elsec.b2=0;if((a.b1&&Link[mid][0][0]&&b.c1) || (b.b2&&Link[mid][1][1]&&a.c1))c.c1=1;else c.c1=0;if((a.b2&&Link[mid][1][1]&&b.c2) || (b.b1&&Link[mid][0][0]&&a.c2))c.c2=1;else c.c2=0;return c;
}void build(int k,int l,int r)
{mp[k].init();if(l==r){mp[k].b1=mp[k].b2=1;return;}int mid=(l+r)>>1;build(k<<1,l,mid); build(k<<1|1,mid+1,r);//mp[k]=PushUp(mp[k<<1],mp[k<<1|1],mid);
}void Update(int k,int l,int r,int x)
{if(l==r && l==x){mp[k].b1=mp[k].b2=1;mp[k].a1=mp[k].a2=mp[k].c1=mp[k].c2=Link[x][0][1];return;}int mid=(l+r)>>1;if(x<=mid) Update(k<<1,l,mid,x);else Update(k<<1|1,mid+1,r,x);mp[k]=PushUp(mp[k<<1],mp[k<<1|1],mid);
}void Change(int x)
{if(c1==c2){Link[c1][0][1]=x;Update(1,1,n,c1);}else{int c=min(c1,c2);Link[c][r1][r1]=x;Update(1,1,n,c);}
}node Query(int k,int l,int r,int L,int R)
{if(l>=L && r<=R){return mp[k];}int mid=(l+r)>>1;node ret; ret.init();if(R<=mid) return Query(k<<1,l,mid,L,R);else if(L>mid) return Query(k<<1|1,mid+1,r,L,R);else return PushUp(Query(k<<1,l,mid,L,mid),Query(k<<1|1,mid+1,r,mid+1,R),mid);
}void Ask()
{if(c1>c2){swap(c1,c2); swap(r1,r2);}node l=Query(1,1,n,1,c1);node mid=Query(1,1,n,c1,c2);node r=Query(1,1,n,c2,n);if(r1==r2){if(r1==0){if(mid.b1 || (l.a2&&mid.c2) || (r.a1&&mid.c1) || (l.a2&&mid.b2&&r.a1)){printf("Y");}else{printf("N");}}else if(r1==1){if(mid.b2 || (l.a2&&mid.c1) || (r.a1&&mid.c2) || (l.a2&&mid.b1&&r.a1)){printf("Y");}else{printf("N");}}}else{if(r1==0){if(mid.c1 || (l.a2&&mid.b2) || (r.a1&&mid.b1) || (l.a2&&mid.c2&&r.a1)){printf("Y");}else{printf("N");}}else if(r1==1){if(mid.c2 || (l.a2&&mid.b1) || (r.a1&&mid.b2) || (l.a2&&mid.c1&&r.a1)){printf("Y");}else{printf("N");}}}printf("\n");
}int main()
{scanf("%d",&n);build(1,1,n);while(~scanf("%s",cmd) && cmd[0]!='E'){scanf("%d%d%d%d",&r1,&c1,&r2,&c2);r1--; r2--;if(cmd[0]=='O'){Change(1);}else if(cmd[0]=='C'){Change(0);}else{Ask();}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 函数隐藏

C该函数隐藏 只有基类成员函数的定义已声明virtualkeyword&#xff0c;当在派生类中的时间&#xff0c;以支付功能实现&#xff0c;virtualkeyword可以从时间被添加以增加。它不影响多状态。 easy混淆视听&#xff0c;掩盖&#xff1a; &#xff0c;规则例如以下&#xff1a; …

迷宫求解(递归)

首先来看一下迷宫简易图                                  我们用 0 来表示该位置是墙, 用 1 来表示该位置是路. 所以, 我们在处理迷宫问题的时候可以将其看成一个二维数组即可, 而对应的每一条路我们可以用坐标的形式将其表示, 所以还需要…

CodeForces - 786C——二分+模拟?

【题目描述】 Rick and Morty want to find MR. PBH and they cant do it alone. So they need of Mr. Meeseeks. They Have generated n Mr. Meeseeks, standing in a line numbered from 1 to n. Each of them has his own color. i-th Mr. Meeseeks color is ai.Rick and M…

迷宫求解(非递归)

上篇文章写出了利用函数形成栈桢的特性完成迷宫求解问题, 本篇文章我们自己手动维护一个栈, 其进行出栈, 入栈, 取栈顶元素, 来完成迷宫求解寻路的过程     思路和以前一样, 首先, 我们先定义一个栈, 对其初始化, 同时, 定义一个迷宫地图, 对该地图进行初始化, 先判断当前…

数据结构练习——双向链表

http://www.cnblogs.com/-Lei/archive/2012/04/10/2440399.html 复习一下数据结构。。。。说不准下个星期就用上了 只不过写的很简单&#xff0c;没有封装 DoubleLinkList.h #ifndef GUARD_DoubleLinkList_h #define GUARD_DoubleLinkList_h#include <stdio.h>struct Li…

CodeChef - DGCD——树链剖分+差分

【题目描述】 Youre given a tree on N vertices. Each vertex has a positive integer written on it, number on the ith vertex being vi. Your program must process two types of queries :1. Find query represented by F u v : Find out gcd of all numbers on the uniq…

UVa272-TeX中的引号

【题目描述】 传送门 【题目分析】 今天开始刷紫书的题目啦 这道题很简单&#xff0c;需要注意的是cgetchar()需要加上括号&#xff0c;因为赋值语句的优先级比判等低 而且书中说好像最好用整型变量&#xff0c;因为EOF的值为-1&#xff0c;在字符变量中没有这个值。&#xf…

C++中友元(友元函数和友元类)的用法和功能

http://blog.csdn.net/adriano119/article/details/5914443/ 采用类的机制后实现了数据的隐藏与封装&#xff0c;类的数据成员一般定义为私有成员&#xff0c;成员函数一般定义为公有的&#xff0c;依此提供类与外界间的通信接口。但是&#xff0c;有时需要定义一些函数&#x…

线程的终止分离

1.线程的终止 注意该函数是针对用户级别的, 其中 retal 必须指向一个全局变量, 或者是一个 malloc 分配的, 因为如果是线程的局部变量, 当该线程退出时, 其他线程不能得到这个变量, 因为线程的局部变量各自私有 2. 现成的取消 其中thread是线程的 tid 3.线程的等待与分离 (1)…

UVa10082

【题目描述】 传送门 【题目分析】 同样是一道模拟&#xff0c;但是如何巧妙快速的解决仍然不简单。通过这道题告诉我们对于复杂确定的对应关系我们要灵活运用常量数组。 同时还需要注意的一个小问题就是字符串数组中的"//"指的是转义后的单斜杠&#xff0c;如果只…

C语言中的深拷贝和浅拷贝

http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct _student{char name[30];char *title;…

死锁的产生和避免

1.死锁产生的四个必要条件 (1)互斥条件&#xff1a;资源是独占的且排他使用&#xff0c;进程互斥使用资源&#xff0c;即任意时刻一个资源只能给一个进程使用&#xff0c;其他进程若申请一个资源&#xff0c;而该资源被另一进程占有时&#xff0c;则申请者等待直到资源被占有者…

UVa401

【题目描述】 传送门 【题目描述】 嘻嘻&#xff0c;自己做直接AC还是比较开心的。当然有一部分原因是之前看书的时候详细看过这个题的代码&#xff0c;但是这已经快一年了&#xff0c;应该说做出这道题凭借的是自己的能力吧。回过身去看了一下书中的代码发现自己写的不算复…

gethostbyname() 函数说明

https://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件#include <netdb.h>#include <sys/socket.h>函数原型struct hostent *gethostbyname(const char *name);这个函数的传入值是域…

求解迷宫最短路径

1. 多通路迷宫初始化 先构建一个多通路迷宫,并且对其初始化 void MazeInitShortPath(Maze* maze) {if(maze NULL){return;}int row 0;int col 0;for(; row < MAX_COL; row){for(col 0; col < MAX_COL; col){maze -> map[row][col] Map[row][col];}printf("…

UVa340

【题目描述】 传送门 【题目分析】 题目理解以后十分简单&#xff0c;但是这题面实在让人自闭&#xff0c;这么简单的题目啦啦啦啦说了那么多&#xff0c;实在是看不懂。&#xff08;幸亏我看了书理解了题目的意思&#xff0c;要不然。。&#xff09;还是要锻炼自己的读题能…

C语言:结构体中一级指针和二级指针的创建与释放示例

http://blog.csdn.net/Bixiwen_liu/article/details/53610952 这几天把C语言巩固了一下&#xff0c;作为一门最基本的编程语言&#xff0c;C语言还是相当基础和非常重要的&#xff0c;个人认为C语言还是很有必要学好吃透的。 今天写的话题是结构体结构体中一级指针和二级指针的…

带环迷宫求最短路径

前面介绍了简单的迷宫求解问题, 今天我们就对带环迷宫求出它的最短路径 1.首先来看一个带环迷宫的简单地图 在这张迷宫地图中,我们规定入口点的位置entry的坐标是 (0, 1), 同时, 我们给入口点传一个非法坐标,作为入口点的前一个位置(-1, -1). 接下来的思路就和上一篇的思路是一…

UVa1583

【题目描述】 传送门 【题目分析】 我以为很简单就写了一个暴力没有想到超时了。应该是T是非常大的所以必须得打表&#xff0c;将所有的结果都储存起来然后直接输出。 以后遇到这种可以一下算出所有结果的多组数据最好还是算出所有的结果然后再输出答案。 【AC代码】 #inc…

C 结构体嵌套一级指针 二级指针 动态分配内存

https://blog.csdn.net/xielinhua88/article/details/51364623 点击打开链接 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //结构体嵌套一级指针 二级指针 动态分配内存 typedef struct _Teacher { int ag…