題目描述
有一天,由於某種穿越現象作用,你來到了傳說中的小人國。小人國的布局非常奇特,整個國家的交通系統可
以被看成是乙個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;
題解
這麼**的題我居然能一a。。。
我寫的比較麻煩,用二元組[0/1][0/1]來表示當前矩形的四個角,再去維護每個小矩形,線段樹維護合併後的大矩形。
討論比較噁心。。
**
#include#include#include
#define n 100009
using
namespace
std;
char s[10
];int
n;inline
intrd()
while(isdigit(c))
return f?-x:x;
}struct
node
inline
void clear()
inline
void
print()
}now[n];
struct
segtr[n
<<1
];int tot=1
;void build(int cnt,int l,int
r)void upd(int cnt,int l,int r,int tag,int x,int
y)
int mid=(l+r)>>1
;
if(mid>=x)upd(tr[cnt].ls,l,mid,tag,x,y);
else upd(tr[cnt].rs,mid+1
,r,tag,x,y);
tr[cnt].val=tr[tr[cnt].ls].val+tr[tr[cnt].rs].val;
}node _query(
int cnt,int l,int r,int x,int
tag)
int mid=(l+r)>>1
;
if(mid>=x)return
_query(tr[cnt].ls,l,mid,x,tag);
else
return _query(tr[cnt].rs,mid+1
,r,x,tag);
}node query(
int cnt,int l,int r,int l,int
r)int
main()
else upd(1,1,n-1,r1,min(x,y),0
); }
else
if(s[0]=='o'
)
else upd(1,1,n-1,r1,min(x,y),1
); }
else
else
}else
else
}if(ans)puts("
y");else puts("n"
); }
}return0;
}
SHOI2008 堵塞的交通
有一篇超級棒的線段樹 大力分類討論的題解!戳我 可是我還是不會寫這個做法qwqwqwq 這裡提供線段樹分治的寫法。感覺比較不需要智商,就是跑的有點慢了。include include include include include include include include define max...
SHOI2008 堵塞的交通
這裡提供幾種不用腦子的演算法 當然是離線的 text 記下每條邊的刪除時間,用 text 維護最大生成樹,每次加進一條邊時,跟原來那條鏈上的做比較,刪除那條刪除時間最短的邊即可。線段樹分治 這個演算法將每條邊的加入和刪除時間加入到線段樹中,所以在遍歷到葉子節點時,那個時刻存在的邊都已經在並查集上了,...
SHOI2008 堵塞的交通
有一天,由於某種穿越現象作用,你來到了傳說中的小人國。小人國的布局非常奇特,整個國家的交通系統可 以被看成是乙個2行c列的矩形網格,網格上的每個點代表乙個城市,相鄰的城市之間有一條道路,所以總共有2c個 城市和3c 2條道路。小人國的交通狀況非常槽糕。有的時候由於交通堵塞,兩座城市之間的道路會變得不...