Poj 1823 Hotel (线段树 区间合并 成段更新)
2013-08-09 19:44
281 查看
题目
注意更新的范围是[i,M+i-1];
注意更新的范围是[i,M+i-1];
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 16100 inline int input() { int ret=0; char c; c=getchar(); while(c<'0'||c>'9') { c=getchar(); } while(c>='0'&&c<='9') { ret=ret*10+c-'0'; c=getchar(); } return ret; } struct node { int l,r,lazy; int lsum1,rsum1,lsum0,rsum0,msum1,msum0; }root[N*6]; inline void Pushup(int t) { int ll=root[t*2].r-root[t*2].l+1; int lr=root[t*2+1].r-root[t*2+1].l+1; root[t].lsum1=root[t*2].lsum1+(root[t*2].lsum1==ll?root[t*2+1].lsum1:0); root[t].lsum0=root[t*2].lsum0+(root[t*2].lsum0==ll?root[t*2+1].lsum0:0); root[t].rsum1=root[t*2+1].rsum1+(root[t*2+1].rsum1==lr?root[t*2].rsum1:0); root[t].rsum0=root[t*2+1].rsum0+(root[t*2+1].rsum0==lr?root[t*2].rsum0:0); root[t].msum0=max(max(root[t*2].msum0,root[t*2+1].msum0),root[t*2].rsum0+root[t*2+1].lsum0); root[t].msum1=max(max(root[t*2].msum1,root[t*2+1].msum1),root[t*2].rsum1+root[t*2+1].lsum1); } inline void Pushdown(int t) { if(root[t].lazy!=-1) { int ll=root[t*2].r-root[t*2].l+1; int lr=root[t*2+1].r-root[t*2+1].l+1; root[t*2].lazy=root[t*2+1].lazy=root[t].lazy; root[t*2].lsum0=root[t*2].rsum0=root[t*2].msum0=(root[t].lazy==0?ll:0); root[t*2].lsum1=root[t*2].rsum1=root[t*2].msum1=(root[t].lazy==0?0:ll); root[t*2+1].lsum0=root[t*2+1].rsum0=root[t*2+1].msum0=(root[t].lazy==0?lr:0); root[t*2+1].lsum1=root[t*2+1].rsum1=root[t*2+1].msum1=(root[t].lazy==0?0:lr); root[t].lazy=-1; } } inline void build(int t,int x,int y) { root[t].l=x; root[t].r=y; root[t].lazy=-1; if(x==y) { root[t].msum0=root[t].lsum0=root[t].rsum0=1; root[t].msum1=root[t].lsum1=root[t].rsum1=0; return; } int m=(x+y)>>1; build(t*2,x,m); build(t*2+1,m+1,y); Pushup(t); } inline void Modefiy(int t,int x,int y,int val) { int l=root[t].l; int r=root[t].r; if(l==x&&y==r) { int L=root[t].r-root[t].l+1; root[t].lazy=val; root[t].msum0=root[t].lsum0=root[t].rsum0=(val==0?L:0); root[t].msum1=root[t].lsum1=root[t].rsum1=(val==0?0:L); return; } Pushdown(t); int m=(l+r)>>1; if(x<=m) Modefiy(t*2,x,min(m,y),val); if(y>m) Modefiy(t*2+1,max(m+1,x),y,val); Pushup(t); } int main() { int n; while(~scanf("%d",&n)) { build(1,1,n); int p=input(); for(int i=1;i<=p;i++) { int op=input(); if(op==3) printf("%d\n",root[1].msum0); else if(op==1) { int x=input(),y=input(); Modefiy(1,x,x+y-1,1); } else if(op==2) { int x=input(),y=input(); Modefiy(1,x,x+y-1,0); } } } return 0; }
相关文章推荐
- POJ 3667 Hotel 线段树 区间合并(成段更新)
- POJ 3667 & 1823 Hotel (线段树区间合并)
- POJ 3667 & 1823 Hotel (线段树区间合并)
- [POJ 1823] Hotel 线段树区间合并
- POJ 3667 & 1823 Hotel (线段树区间合并)
- poj 3667 Hotel(线段树,成段更新,区间合并,Lazy思想)
- poj 3667 hotel 线段树成段更新区间合并
- POJ 1823 Hotel(线段树区间更新)
- POJ 3667——Hotel(线段树,区间合并)
- poj 3667 Hotel(此题跟poj 1823有共同点,都属于区间合并问题)
- POJ 3667 Hotel 【线段树 区间合并 + Lazy-tag】
- POJ-3667 Hotel 线段树区间合并
- poj 3667 Hotel(线段树区间更新合并)
- 【POJ 3667】 hotel 【线段树 +区间操作+区间合并】
- POJ-3667:Hotel(线段树区间合并)
- poj 1823 Hotel(数据结构:线段树--区间更新)
- 线段树区间合并(POJ 3667 Hotel ,HDU HDU3308 LCIS)
- poj(3667)——hotel(线段树区间合并)
- POJ 3667 Hotel (线段树区间合并)
- poj 3667 Hotel 线段树区间合并