鏈結
p4246
題解線段樹之什麼都能維護
用線段樹維護連通性。
用線段樹維護乙個區間的連通性,發現你其實需要維護的本質不同的資訊就是這個矩形上下左右以及兩條對角線的連通性。
然後考慮合併兩個矩形連通性,發現因為矩形高度只有 \(2\),所以可以幫你排除一些感覺很奇怪的合併方法,具體可以看這篇的圖很清晰。
修改時,對於豎邊直接傳到 l=r 修改;對於橫邊,修改影響最小的區間是以這條橫邊為 mid 的區間。
最後統計答案時要分成三塊來考慮,根據所有可能路徑的組成來合併。
總之是一道比較大力分類討論加牛逼線段樹的題。
code
#includeusing namespace std;
#define cs const
#define in read()
inline int read()
while(isdigit(c))
return p*f;
}cs int n=1e5+5;
int n;
bool uc[n],dc[n];
struct nodea[n<<2];
inline void pushup(node &p,node x,node y)
inline void built(int l,int r,int p)
int mid=(l+r)>>1;built(l,mid,p<<1),built(mid+1,r,p<<1|1),pushup(a[p],a[p<<1],a[p<<1|1]);
}inline void change1(int l,int r,int p,int x,int d)
if(x<=mid)change1(l,mid,p<<1,x,d);
else change1(mid+1,r,p<<1|1,x,d);
pushup(a[p],a[p<<1],a[p<<1|1]);
}inline void change2(int l,int r,int p,int x,int ud,int d)
if(x=ql&&r<=qr)return a[p];
int mid=(l+r)>>1;
if(qr<=mid)return query(l,mid,p<<1,ql,qr);
if(ql>mid)return query(mid+1,r,p<<1|1,ql,qr);
node ans;pushup(ans,query(l,mid,p<<1,ql,qr),query(mid+1,r,p<<1|1,ql,qr));
return ans;
}string s;
int r1,c1,r2,c2;
int t=0;
signed main()
else
cin>>s;
} return 0;
}
SHOI2008 堵塞的交通
有一篇超級棒的線段樹 大力分類討論的題解!戳我 可是我還是不會寫這個做法qwqwqwq 這裡提供線段樹分治的寫法。感覺比較不需要智商,就是跑的有點慢了。include include include include include include include include define max...
SHOI2008 堵塞的交通
這裡提供幾種不用腦子的演算法 當然是離線的 text 記下每條邊的刪除時間,用 text 維護最大生成樹,每次加進一條邊時,跟原來那條鏈上的做比較,刪除那條刪除時間最短的邊即可。線段樹分治 這個演算法將每條邊的加入和刪除時間加入到線段樹中,所以在遍歷到葉子節點時,那個時刻存在的邊都已經在並查集上了,...
SHOI2008 堵塞的交通
有一天,由於某種穿越現象作用,你來到了傳說中的小人國。小人國的布局非常奇特,整個國家的交通系統可 以被看成是乙個2行c列的矩形網格,網格上的每個點代表乙個城市,相鄰的城市之間有一條道路,所以總共有2c個 城市和3c 2條道路。小人國的交通狀況非常槽糕。有的時候由於交通堵塞,兩座城市之間的道路會變得不...