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...