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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj3667 区间合并,找最左边的空余块

發布時間:2024/7/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj3667 区间合并,找最左边的空余块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題很簡單:給兩個操作1:查找最左邊的a個空余塊并填滿

          2:把從第a個開始的連續b個塊置空

線段樹維護左連續,右連續,最大連續,lazy-tag即可,query函數值得學習

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 500005 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int lmx[maxn<<2],rmx[maxn<<2],mx[maxn<<2],flag[maxn<<2];inline void set0(int l,int r,int rt){lmx[rt]=rmx[rt]=mx[rt]=r-l+1;flag[rt]=0; } inline void set1(int l,int r,int rt){lmx[rt]=rmx[rt]=mx[rt]=0;flag[rt]=1; } inline void pushup(int l,int r,int rt){lmx[rt]=lmx[rt<<1];rmx[rt]=rmx[rt<<1|1];mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);int m=l+r>>1;if(lmx[rt<<1]==m-l+1) lmx[rt]+=lmx[rt<<1|1];if(rmx[rt<<1|1]==r-m) rmx[rt]+=rmx[rt<<1];if(rmx[rt<<1]&&lmx[rt<<1|1]) mx[rt]=max(mx[rt],rmx[rt<<1]+lmx[rt<<1|1]); } inline void pushdown(int l,int r,int rt){if(flag[rt]>=0){int m=l+r>>1; flag[rt<<1]=flag[rt<<1|1]=flag[rt];if(flag[rt]==0){set0(lson);set0(rson);}else if(flag[rt]==1){set1(lson);set1(rson);}flag[rt]=-1;} } void build(int l,int r,int rt){if(l==r){lmx[rt]=rmx[rt]=mx[rt]=1;flag[rt]=-1;return;}int m=l+r>>1;build(lson);build(rson);pushup(l,r,rt); } void update(int L,int R,int op,int l,int r,int rt){if(L<=l && R>=r){if(op==0) set0(l,r,rt);if(op==1) set1(l,r,rt);return;}pushdown(l,r,rt);int m=l+r>>1;if(L<=m) update(L,R,op,lson);if(R>m)update(L,R,op,rson);pushup(l,r,rt); } //cnt要么在左兒子,要么在中間合并塊,要么在右子樹 int query(int cnt,int l,int r,int rt){if(l==r)return l;pushdown(l,r,rt);int m=l+r>>1;if(cnt<=mx[rt<<1])return query(cnt,lson);else if(cnt<=rmx[rt<<1]+lmx[rt<<1|1])return m-rmx[rt<<1]+1;else return query(cnt,rson); } int main(){int n,m;while(scanf("%d%d",&n,&m)==2){build(1,n,1);int a,b,op;while(m--){scanf("%d",&op);if(op==1){scanf("%d",&a);if(mx[1]<a){puts("0");continue;}int tmp=query(a,1,n,1);printf("%d\n",tmp);update(tmp,tmp+a-1,1,1,n,1);}else if(op==2){scanf("%d%d",&a,&b);update(a,a+b-1,0,1,n,1);}}}return 0; }

?

轉載于:https://www.cnblogs.com/zsben991126/p/9977184.html

總結

以上是生活随笔為你收集整理的poj3667 区间合并,找最左边的空余块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。