日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj-3667(线段树区间合并)

發(fā)布時間:2023/11/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj-3667(线段树区间合并) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:傳送門

參考文章:傳送門

思路:線段樹區(qū)間合并問題,每次查詢到滿足線段樹的區(qū)間最左值,然后更新線段樹。

#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 50500; int lsum[maxn<<2],rsum[maxn<<2],msum[maxn<<2],cover[maxn<<2]; void build(int x,int l,int r) {lsum[x]=rsum[x]=msum[x]=r-l+1;if(l==r) return ;int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r); } int MAX(int x,int y) {return x>y?x:y; } void pushup(int x,int k) {lsum[x]=lsum[x<<1];rsum[x]=rsum[x<<1|1];msum[x]=MAX(MAX(msum[x<<1],msum[x<<1|1]),lsum[x<<1|1]+rsum[x<<1]);if(lsum[x<<1]==(k-(k>>1))) lsum[x]+=lsum[x<<1|1];if(rsum[x<<1|1]==k>>1) rsum[x]+=rsum[x<<1]; } void pushdown(int x,int k) {if(cover[x]!=-1){cover[x<<1]=cover[x<<1|1]=cover[x];lsum[x<<1]=rsum[x<<1]=msum[x<<1]=cover[x]?0:(k-(k>>1));lsum[x<<1|1]=rsum[x<<1|1]=msum[x<<1|1]=cover[x]?0:(k>>1);cover[x]=-1;} } void update(int x,int l,int r,int A,int B,int Item) {if(A<=l&&r<=B) {cover[x]=Item;lsum[x]=rsum[x]=msum[x]=Item?0:r-l+1;return ;}pushdown(x,r-l+1);int mid=(l+r)>>1;if(A<=mid) update(x<<1,l,mid,A,B,Item);if(B>mid) update(x<<1|1,mid+1,r,A,B,Item);pushup(x,r-l+1); } int query(int x,int l,int r,int len) {if(l==r) return 1;pushdown(x,r-l+1);int mid=(l+r)>>1;if(msum[x<<1]>=len) return query(x<<1,l,mid,len);else if(rsum[x<<1]+lsum[x<<1|1]>=len) return mid-rsum[x<<1]+1;else return query(x<<1|1,mid+1,r,len); } int main(void) {int n,m,i,x,y,z;while(~scanf("%d%d",&n,&m)){build(1,1,n);while(m--){scanf("%d",&x);if(x==1){scanf("%d",&y);if(msum[1]<y){printf("0\n");continue;}z=query(1,1,n,y);printf("%d\n",z);update(1,1,n,z,z+y-1,1);}else{scanf("%d%d",&y,&z);update(1,1,n,y,y+z-1,0);}}}return 0; } View Code

?

http://poj.org/problem?id=3667

轉(zhuǎn)載于:https://www.cnblogs.com/2018zxy/p/10204329.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的poj-3667(线段树区间合并)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。