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.pswp.cn/news/384047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384047.shtml
英文地址,請注明出處:http://en.pswp.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…