i题意
? ? ? ?和poj1823差不多,加了一个查询最左可行的位置
思路
? ? ? ?查询的时候根据不同的sta,分情况讨论
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax = 1000000;
struct{
int l,r,val,lmx,rmx,sta; //0empty 1full -1mix
}node[3*nMax];
void gao(int u){
if(node[u].sta == 0){
node[u].val = node[u].lmx = node[u].rmx = node[u].r - node[u].l + 1;
}else{
node[u].val = node[u].lmx = node[u].rmx =0;
}
}
void build(int l ,int r ,int u){
node[u].l = l;
node[u].r = r;
node[u].sta = 0;
gao(u);
if(l == r){
return;
}
int m = (l+r)>>1;
build(l ,m ,u*2);
build(m+1 ,r ,u*2 + 1);
}
void update(int left ,int right ,int ope ,int u){
int l = node[u].l;
int r = node[u].r;
if(l == left && r == right){
node[u].sta = ope;
gao(u);
return;
}
if(node[u].sta == ope)return ;
if(node[u].sta != -1){
node[2*u].sta = node[2*u+1].sta = node[u].sta;
gao(u*2),gao(u*2+1);
node[u].sta = -1;
}
int m = (l + r)>>1;
if(right <= m){
update(left ,right ,ope ,u*2);
}else{
if(left >= m + 1){
update(left ,right ,ope ,u*2+1);
}else{
update(left ,m ,ope ,u*2);
update(m+1,right ,ope ,u*2+1);
}
}
if(node[u*2].sta == 0){
node[u].lmx = node[u*2].val + node[u*2+1].lmx;
}else{
node[u].lmx = node[u*2].lmx;
}
if(node[u*2+1].sta == 0){
node[u].rmx = node[u*2+1].val + node[u*2].rmx;
}else{
node[u].rmx = node[u*2+1].rmx;
}
node[u].val = max(node[u*2].val,node[u*2+1].val);
node[u].val = max(node[u].val,node[u*2].rmx+node[u*2+1].lmx);
if(node[u*2].sta == node[u*2+1].sta){
node[u].sta = node[u*2].sta;
}
}
int query(int val ,int u){
if(node[u].sta == 0 && node[u].val >= val){
return node[u].l;
}
if(node[u].sta == 1){
return 0;
}
if(node[u].sta == -1){
if(node[u*2].val >= val){
return query(val ,2*u);
}else{
if(node[2*u].rmx + node[2*u+1].lmx >= val){
return node[2*u].r - node[2*u].rmx + 1;
}else{
return query(val ,u*2 + 1);
}
}
}
return 0;
}
int main(){
int n ,m ,a ,b ,c;
while(scanf("%d%d",&n,&m)!=EOF){
build(1 ,n ,1);
while(m--){
scanf("%d",&a);
if(a == 1){
scanf("%d",&b);
c = query(b ,1);
printf("%d\n",c);
if(c != 0){
update(c ,c+b-1 ,1 ,1);
}
}else{
scanf("%d%d",&b,&c);
update(b ,b + c -1 ,0 ,1 );
}
}
}
return 0;
}
?
原文:http://bbezxcy.iteye.com/blog/2162098