BZOJ4592 Shoi2015 腦洞治療儀

2022-03-29 16:21:38 字數 2596 閱讀 8655

bzoj4592: [shoi2015]腦洞**儀

曾經發明了自動刷題機的發明家shtsc又公開了他的新發明:腦洞**儀--一種可以**他因為發明而日益增大的腦洞的神秘裝置。

為了簡單起見,我們將大腦視作乙個01序列。1代表這個位置的腦組織正常工作,0代表這是一塊腦洞。

腦洞**儀修補某一塊腦洞的基本工作原理就是將另一塊連續區域挖出,將其中正常工作的腦組織填補在這塊腦洞中。

(所以腦洞**儀是腦洞的**儀?)

例如,用上面第8號位置到第10號位置去修補第1號位置到第4號位置的腦洞。我們就會得到:

如果再用第1號位置到第4號位置去修補第8號位置到第10號位置:

這是因為腦洞**儀會把多餘出來的腦組織直接扔掉。

如果再用第7號位置到第10號位置去填補第1號位置到第6號位置:

這是因為如果新腦洞挖出來的腦組織不夠多,腦洞**儀僅會盡量填補位置比較靠前的腦洞。

假定初始時shtsc並沒有腦洞,給出一些挖腦洞和腦洞**的操作序列,你需要即時回答shtsc的問題:

在大腦某個區間中最大的連續腦洞區域有多大。

第一行兩個整數n,m。表示shtsc的大腦可分為從1到n編號的n個連續區域。有m個操作。

以下m行每行是下列三種格式之一。

0 l r :shtsc挖了乙個從l到r的腦洞。

1 l0 r0 l1 r2 :shtsc進行了一次腦洞**,用從l0到r0的腦組織修補l1到r1的腦洞。

2 l r :shtsc詢問l到r這段區間最大的腦洞有多大。

n,m <=200000,1<=l<=r<=n

對於每個詢問,輸出一行乙個整數,表示詢問區間內最大連續腦洞區域有多大。

10 10

0 2 2

0 4 6

0 10 10

2 1 10

1 8 10 1 4

2 1 10

1 1 4 8 10

2 1 10

1 7 10 1 6

2 1 1033

66區間操作,當然線段樹。

能寫線段樹沒人會寫$splay$的。。。

操作一直接區間覆蓋。

操作三維護$lsum,rsum,sum$分別表示區間內從左端點開始最長連續腦洞區域大小,從右端點開始最長連續腦洞區域大小,區間最長連續腦洞區域大小。

維護一下就好。

操作二一眼沒看出來怎麼搞。

多捨少漏。。。二分一下能填補的長度不就好了?

顯然這個區間滿足單調性,於是二分出區間。

然後線段樹區間修改即可。

於是,就沒了?

嗯,沒了。

附帶碼:

#include#include#include#define lson rt<<1

#define rson rt<<1|1

#define data(x) a[x].data

#define sign(x) a[x].c

#define lsum(x) a[x].lsum

#define rsum(x) a[x].rsum

#define sum(x) a[x].sum

#define lside(x) a[x].l

#define rside(x) a[x].r

#define width(x) (rside(x)-lside(x)+1)

#define maxn 200010

using namespace std;

int n,m;

struct segment_treea[maxn<<2];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}inline void pushup(int rt)

inline void pushdown(int rt)

else

sign(rt)=-1;

}void buildtree(int l,int r,int rt)

int mid=l+r>>1;

buildtree(l,mid,lson);

buildtree(mid+1,r,rson);

pushup(rt);

}void update(int l,int r,int c,int rt)

pushdown(rt);

int mid=lside(rt)+rside(rt)>>1;

if(l<=mid)update(l,r,c,lson);

if(mid>1;

if(l<=mid)ans+=query_sum(l,r,lson);

if(mid>1;

segment_tree lson=,rson=,ans=;

if(l<=mid)lson=query(l,r,lson);

if(mid>1;

if(mid-query_sum(l1,l1+mid-1,1)<=s)

else r=mid-1;

} update(l1,l1+len-1,1,1);

}void work()

else printf("%d\n",query(l,r,1).sum); }}

void init()

int main()

BZOJ4592 Shoi2015 腦洞治療儀

進行 實際上相當於用1覆蓋一段區間,這段區間內原有的1的個數加上挖出來的1的個數等於這段區間的長度,並且這段區間的長度最長為 的區間長度 知道了一段區間的長度,區間裡有多少1,還剩多少腦組織,就能知道這段區間是否被完全覆蓋 需要判斷是否還剩腦組織,如果沒了就返回,要不然複雜度不對 複雜度 o m l...

BZOJ4592 Shoi2015 腦洞治療儀

bzoj4592 吐槽一下ds y 我 這個資料 了一天我xx x!一開始看到這個題。誒,區間連續最大和誒!把腦洞的值為1,正常的賦為 i nf但是操作1怎麼辦。發現就是先統計出l0 到r0 區間內 i nf的個數to t 然後區間賦為1.然後統計l1 到r1 區間內1的個數to t 如果to t ...

BZOJ 4592 Shoi2015 腦洞治療儀

4592 shoi 2015 腦 洞治療儀 4592 shoi2015 腦洞 儀 4592 shoi 2015 腦洞治 療儀description 曾經發明了自動刷題機的發明家shtsc又公開了他的新發明 腦洞 儀 一種可以 他因為發明而日益增大的腦洞的神秘裝置。為了簡單起見,我們將大腦視作乙個01...