首页 > 代码库 > bzoj1593/poj3667

bzoj1593/poj3667

HYSBZ - 1593  POJ - 3667 

题意:中文题

思路:线段树区间合并裸题,不过lazy初始化搞错了,每次只初始化了叶子节点,wa一年,bzoj和poj又同时来例假,不过洛谷也有这个题,可能是太经典了把,但是居然卡我ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); 无限RE,果然是什么错误都能返回RE。。。

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define endl "\n"
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a,x) memset(a,x,sizeof(a))
#define mp(x,y) make_pair(x,y)
#define ft (frist)
#define sd (second)
#define pb(x) push_back(x)
#define lrt (rt<<1)
#define rrt (rt<<1|1)
using namespace std;
const long long INF = 1e18+1LL;
const int inf = 1e9+1e8;
const int N=1e5+100;
const ll mod=1e9+7;

int sum[N<<1],lsum[N<<1],rsum[N<<1],lazy[N<<1],n,q;
void push_up(int rt, int m){
    int rm=m>>1, lm=m-rm;
    lsum[rt]=lsum[lrt];
    rsum[rt]=rsum[rrt];
    if(lsum[rt]==lm){
        lsum[rt]+=lsum[rrt];
    }
    if(rsum[rt]==rm){
        rsum[rt]+=rsum[lrt];
    }
    sum[rt]=max(sum[lrt],sum[rrt]);
    sum[rt]=max(sum[rt],lsum[rrt]+rsum[lrt]);
}

void push_down(int rt, int m){
    int rm=m>>1, lm=m-rm;
    if(lazy[rt]==0) lm=rm=0;
    lsum[lrt]=rsum[lrt]=sum[lrt]=lm;
    lsum[rrt]=rsum[rrt]=sum[rrt]=rm;
    lazy[lrt]=lazy[rrt]=lazy[rt];
    lazy[rt]=-1;
}

void creat(int rt, int l, int r){
    if(l==r){
        sum[rt]=lsum[rt]=rsum[rt]=1;
        return;
    }
    lazy[rt]=-1;
    int mid=l+r>>1;
    creat(lrt,l,mid);
    creat(rrt,mid+1,r);
    push_up(rt,r-l+1);
}

void update(int rt, int l, int r, int L, int R, int f){
    if(l==L && r==R){
        int m=r-l+1;
        lazy[rt]=f;
        if(!f) m=0;
        lsum[rt]=rsum[rt]=sum[rt]=m;
        return;
    }
    if(lazy[rt]!=-1) push_down(rt,r-l+1);
    int mid=l+r>>1;
    if(R<=mid) update(lrt, l, mid, L, R, f);
    else if(L>mid) update(rrt, mid+1, r, L, R, f);
    else update(lrt, l, mid, L, mid, f), update(rrt, mid+1, r, mid+1, R, f);
    push_up(rt, r-l+1);
}

int query(int rt, int l ,int r, int b){
    if(lsum[rt]>=b || l==r) return l;
    if(lazy[rt]!=-1) push_down(rt,r-l+1);
    int mid=l+r>>1;
    if(sum[lrt]>=b) return query(lrt,l,mid,b);
    else if(rsum[lrt]+lsum[rrt]>=b) return mid-rsum[lrt]+1;
    else return query(rrt,mid+1,r,b);
}

int main(){
    while(cin>>n>>q){
        creat(1,1,n);
        int a,b,c;
        while(q--){
            cin>>a>>b;
            if(a==2){
                cin>>c;
                update(1,1,n,b,b+c-1,1);
            }
            else{
                if(sum[1]<b){
                    cout<<"0\n";
                    continue;
                }
                c=query(1,1,n,b);
                cout<<c<<"\n";
                update(1,1,n,c,c+b-1,0);
            }
        }
    }
    return 0;
}

 

bzoj1593/poj3667