HDU4553(线段树区间合并)
来源:互联网 发布:淘宝店以开启,怎么找货 编辑:程序博客网 时间:2024/05/19 06:17
题解:设两个区间表示屌丝剩下的区间,女神剩下的区间,然后用lazy思想更新一下,lazy = 0被更新成空闲的,lazy = 1表示这段区间被更新成屌丝的,lazy = 2表示这段区间被更新成女神的,lazy = -1表示这段区间不做任何操作。
注意一下更新屌丝的时候如果下面的是左右子区间lazy = 0时要先把左右子区间更新一下即可,这样才能确保左右子区间女神没有用
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;#define mid (L+R)/2#define ls rt<<1#define rs rt<<1|1#define lson ls,L,mid#define rson rs,mid+1,Rconst int mx = 1e5+5;struct node{ int lazy; int dl,dr,dm; int nl,nr,nm;}T[mx<<2];void built(int rt,int L,int R){ T[rt].lazy = -1; T[rt].dl = T[rt].dr = T[rt].dm = R-L+1; T[rt].nl = T[rt].nm = T[rt].nr = R-L+1; if(L==R) return; built(lson); built(rson);}void push_up(int rt,int L,int R){ if(mid-L+1==T[ls].dl) T[rt].dl = T[ls].dl+T[rs].dl; else T[rt].dl = T[ls].dl; if(R-mid==T[rs].dr) T[rt].dr = T[ls].dr+T[rs].dr; else T[rt].dr = T[rs].dr; T[rt].dm = max(T[ls].dr+T[rs].dl,max(T[ls].dm,T[rs].dm)); if(mid-L+1==T[ls].nl) T[rt].nl = T[ls].nl+T[rs].nl; else T[rt].nl = T[ls].nl; if(R-mid==T[rs].nr) T[rt].nr = T[ls].nr+T[rs].nr; else T[rt].nr = T[rs].nr; T[rt].nm = max(T[ls].nr+T[rs].nl,max(T[ls].nm,T[rs].nm));}void push_down(int rt,int L,int R){ if(L==R) return; if(T[rt].lazy!=-1){ if(T[rt].lazy==0){ T[ls].dl = T[ls].dm = T[ls].dr = T[ls].nl = T[ls].nm = T[ls].nr = mid-L+1; T[rs].dl = T[rs].dm = T[rs].dr = T[rs].nl = T[rs].nm = T[rs].nr = R-mid; T[ls].lazy = T[rs].lazy = 0; T[rt].lazy = -1; } else if(T[rt].lazy==1){ if(T[ls].lazy==0) push_down(ls,L,mid); if(T[rs].lazy==0) push_down(rs,mid+1,R); T[ls].dl = T[ls].dm = T[ls].dr = 0; T[rs].dl = T[rs].dm = T[rs].dr = 0; T[ls].lazy = T[rs].lazy = 1; T[rt].lazy = -1; } else if(T[rt].lazy==2){ T[ls].dl = T[ls].dm = T[ls].dr = 0; T[rs].dl = T[rs].dm = T[rs].dr = 0; T[ls].nl = T[ls].nm = T[ls].nr = 0; T[rs].nl = T[rs].nm = T[rs].nr = 0; T[ls].lazy = T[rs].lazy = 2; T[rt].lazy = -1; } }}int query_ns(int rt,int L,int R,int x){ push_down(rt,L,R); if(L==R) return L; if(T[ls].nm>=x) return query_ns(lson,x); else if(T[ls].nr+T[rs].nl>=x) return mid-T[ls].nr+1; else return query_ns(rson,x);}int query_ds(int rt,int L,int R,int x){ push_down(rt,L,R); if(L==R) return L; if(T[ls].dm>=x) return query_ds(lson,x); else if(T[ls].dr+T[rs].dl>=x) return mid-T[ls].dr+1; else return query_ds(rson,x);}void update(int rt,int L,int R,int l,int r,int v){ push_down(rt,L,R); if(l <= L&&R <= r){ if(v==0){ T[rt].dl = T[rt].dm = T[rt].dr = T[rt].nl = T[rt].nm = T[rt].nr = R-L+1; T[rt].lazy = 0; } else if(v==1){ T[rt].dl = T[rt].dm = T[rt].dr = 0; T[rt].lazy = 1; } else{ T[rt].dl = T[rt].dm = T[rt].dr = T[rt].nl = T[rt].nm = T[rt].nr = 0; T[rt].lazy = 2; } return; } if(l>mid) update(rson,l,r,v); else if(r<=mid) update(lson,l,r,v); else{ update(lson,l,mid,v); update(rson,mid+1,r,v); } push_up(rt,L,R);}int main(){ int n,q,t,casei = 1; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&q); update(1,1,n,1,n,0); int ans; printf("Case %d:\n",casei++); while(q--){ char s[20]; int x,l,r; scanf("%s",s); if(s[0]=='D'){ scanf("%d",&x); if(T[1].dm<x){ printf("fly with yourself\n"); continue; } ans = query_ds(1,1,n,x); printf("%d,let's fly\n",ans); update(1,1,n,ans,ans+x-1,1); } else if(s[0]=='N'){ scanf("%d",&x); if(T[1].dm<x){ if(T[1].nm<x) printf("wait for me\n"); else{ ans = query_ns(1,1,n,x); update(1,1,n,ans,ans+x-1,2); printf("%d,don't put my gezi\n",ans); } } else{ ans = query_ds(1,1,n,x); update(1,1,n,ans,ans+x-1,2); printf("%d,don't put my gezi\n",ans); } } else{ scanf("%d%d",&l,&r); update(1,1,n,l,r,0); printf("I am the hope of chinese chengxuyuan!!\n"); } } } return 0;}
阅读全文
0 0
- HDU4553(线段树区间合并)
- HDU4553:约会安排(线段树)(第三部分 区间合并)
- HDU4553:约会安排(线段树区间合并)
- hdu4553(神TM烦的线段树维护连续区间ORZ)
- 线段树 (区间合并)
- hdu4553约会安排 线段树
- 线段树 区间合并
- 线段树 区间合并
- 线段树 区间合并
- 线段树 区间合并
- 线段树-区间合并
- poj3667 线段树(区间合并)
- hdu3308(线段树,区间合并)
- poj3667(线段树,区间合并)
- poj3667 Hotel (线段树区间合并)
- LA 3938 线段树(区间合并)
- POJ-3667 线段树(区间合并)
- poj3667 (线段树区间合并)
- 菜鸟的自定轮播图
- 计算几何基础算法
- hihocoder 1426 What a Ridiculous Election
- 如何配置 Sublime Text 的 LaTeXTools?
- 八数码 BFS+HASH
- HDU4553(线段树区间合并)
- colorAccent,colorPrimary,colorPrimaryDark做什么的?
- 牛客网-剑指offer-12-数值的整数次方
- Make Palindrome
- 面试题:整数反序
- Java 用两个队列实现一个栈,要求top()的时间复杂度为O(1)
- 图像处理基本概念——卷积,滤波,平滑
- Hebb Learning 监督学习的例子
- LeetCode AddTwoNumbers