1 2 3 4

P2894 [USACO08FEB]Hotel G

https://www.luogu.com.cn/problem/P2894

线段树区间连续最大的1的个数,加上区间修改,lazy覆盖。虽然不难,写出来还是很interesting的。。

具体看代码吧

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5+11;
int ans[4*maxn],L[4*maxn],R[4*maxn];
 
int lazy[maxn*4];
 
void up(int node,int be,int en){
    int l = node*2;
    int r = node*2+1;
    int mid = be + en  >> 1;
     
    ans[node] = max(ans[l],ans[r]);
    ans[node] = max(ans[node],L[r] +  R[l]);
     
    L[node] = L[l];
    if(mid - be + 1 == L[l]) L[node] = mid - be + 1 + L[r];
     
    R[node] = R[r];
    if(en - mid == R[r]) R[node] = en - mid + R[l];
}
 
 
 
int push(int node,int be,int en){
    int mid = be + en >> 1;
    int l = node * 2;
    int r = node * 2 + 1;
    if(lazy[node]){
        ans[l] = L[l] = R[l] = (mid - be + 1)*(lazy[node]-1);
        ans[r] = L[r] = R[r] = (en - mid)*(lazy[node]-1);
        lazy[l] = lazy[r] = lazy[node];
        lazy[node] = 0;
    }
    return 0;
}
int update(int node,int be,int en,int LL,int RR,int val){//直接用1覆盖
    int mid = be + en >> 1;
    int l = node*2;
    int r = node*2 + 1;
     
    if(LL <= be && en <= RR){
        lazy[node] = val;
        ans[node] = L[node] = R[node] = (en - be + 1)*(val-1);
        return 0;
    }
     
    push(node,be,en);
    if(LL <= mid) update(l,be,mid,LL,RR,val);
    if(RR > mid) update(r,mid+1,en,LL,RR,val);
    up(node,be,en);
    return 0;
}
 
int id = 0;
 
int ask(int node,int be,int en,int x){
    int mid = be + en >> 1;
    int l = node*2;
    int r = node*2 + 1;
    if(be == en){
        id = be;
        return 0;
    }
     
    push(node,be,en);
    if(ans[l] >= x){
        ask(l,be,mid,x);
        up(node,be,en);
    }
    else if(R[l] +  L[r] >= x){
        id = mid - R[l] + 1;
        return 0;
    }
    else if(ans[r] >= x){
        ask(r,mid+1,en,x);
        up(node,be,en);
    }
    else{
        return 0;
    }
    return 0;
}
 
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    update(1,1,n,1,n,2);
    id= 0 ;
    while(m--){
        int op;
        scanf("%d",&op);
        if(op == 1){
            int x;
            scanf("%d",&x);
            id = 0;
            ask(1,1,n,x);
            if(id != 0) update(1,1,n,id,id+x-1,1);
            printf("%lld\n",id);
        }
        else{
            int x,y;
            scanf("%d %d",&x,&y);
            update(1,1,n,x,x + y - 1,2);
        }
    }
    return 0;
}

  

 

posted @   Lesning  阅读(97)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示