$ \rightarrow $戳我進bzoj原題
time limit: 3 sec $ \quad $ memory limit: 162 mb有一天,由於某種穿越現象作用,你來到了傳說中的小人國。
小人國的布局非常奇特,整個國家的交通系統可以被看成是乙個$ 2 $ 行 $ c $ 列的矩形網格,
網格上的每個點代表乙個城市,相鄰的城市之間有一條道路,所以總共有 $ 2 \times c $個城市和 $ 3 \times c−2 $ 條道路。
小人國的交通狀況非常槽糕。有的時候由於交通堵塞,兩座城市之間的道路會變得不連通,直到擁堵解決,道路才會恢復暢通。
初來咋到的你決心毛遂自薦到交通部某份差事,部長聽說你來自乙個科技高度發達的世界,
喜出望外地要求你編寫乙個查詢應答系統,以挽救已經病入膏肓的小人國交通系統。
小人國的交通部將提供一些交通資訊給你,你的任務是根據當前的交通情況回答查詢的問題。交通資訊可以分為以下幾種格式:
注:$ r_i $ 表示行數,$ c_i $ 表示列數,$ 1≤ri≤2,1≤ci≤c1 \leq r_i \leq 2, 1 \leq c_i \leq c $ 。
第一行只有乙個整數 $ c $ ,表示網格的列數。
接下來若干行,每行為一條交通資訊,以單獨的一行exit作為結束。我們假設在一開始所有的道路都是堵塞的。
我們保證 $ c $ 小於等於 $ 100000 $ ,資訊條數小於等於 $ 100000 $ 。
對於每個查詢,輸出乙個y或n。
2
open 1 1 1 2
open 1 2 2 2
ask 1 1 2 2
ask 2 1 2 2
exit
y
n
題解:judgeonline/upload/201604/sol(4).rar
#include#include#include#includeusing namespace std;
#define n 200005
inline int read()
int n;
char opt[5];
struct treet[n<<2];
int a[n<<2][2];
void build(int o,int l,int r)
int mid=l+r>>1;
build(o<<1,l,mid); build(o<<1|1,mid+1,r);
}void pushup(int o,int l,int r)
void updata_row(int o,int l,int r,int x,int p)
int mid=l+r>>1;
if(x>mid) updata_row(o<<1|1,mid+1,r,x,p);
else updata_row(o<<1,l,mid,x,p);
pushup(o,l,r);
}void updata_column(int o,int l,int r,int x,int c,int p)
int mid=l+r>>1;
if(x>mid) updata_column(o<<1|1,mid+1,r,x,c,p);
else updata_column(o<<1,l,mid,x,c,p);
pushup(o,l,r);
}void work(int c1,int r1,int c2,int r2,int p)
}tree query_direct(int o,int l,int r,int l,int r)
}bool query(int c1,int r1,int c2,int r2)
tree tmp=query_direct(1,1,n,c1,c2);
if(tmp.e[r1][r2]) return 1;
tree l=query_direct(1,1,n,1,c1);
tree r=query_direct(1,1,n,c2,n);
if(l.e[2][1] && tmp.e[r1^1][r2]) return 1;
if(r.e[2][0] && tmp.e[r1][r2^1]) return 1;
if(l.e[2][1] && r.e[2][0] && tmp.e[r1^1][r2^1]) return 1;
return 0;
}int main()
return 0;
}
bzoj 1018 堵塞的交通
傳送門 這是一道好題,不容易想到線段樹和維護的量。分析題目,考慮聯通方式,發現只有3種,我一開始的想法是結構分塊,使用並查集維護,o 1 新增很自然,刪除的話就暴力重建塊內的並查集o sqrt n 查詢的時候仍然考慮並查集維護,求出關鍵點 上下左右4個 和他們之間的聯通性,數量級是o sqrt n ...
SHOI2008 堵塞的交通 線段樹
傳送門 線段樹三連。這是一道讓人誤解為水題的線段樹題。實則讓我想罵出題人出了這麼道大毒瘤。題意 維護2 n的網格區域中點的連通性。題解 線段樹維護連通性。把上下兩個城市看作線段樹中的乙個點 合併兩個區間時,只看這兩個區間的左,右端點,更新合併區間的連通性。這個很好想,不過實現起來 嘿嘿嘿 記錄橫向的...
SHOI2008 堵塞的交通(線段樹維護聯通性)
題目 2行c列個點,開始時互不聯通,支援給同一列或著同一行相鄰的兩個點連邊,和詢問兩個點能否在乙個聯通塊裡。1 c 100000 1 運算元 100000 題解線段樹的又乙個騷操作。我們把2 2的4個點看作線段樹上的葉子結點。其他節點就是其兒子的合併 葉子結點的父親表示2 4八個點,然後是2 8,2...