如题。 这是我现在的代码:
#include <cstdio>
#include <iostream>
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
const int maxn = 2e6 + 1;
using namespace std;
int opt, x, y, n, m;
struct node{
int mmax = 0, sum = 0, lmax = 0, rmax = 0, lazy = -1, len;
}t[maxn];
void push_up(int p){
if (t[ls].mmax == t[ls].len){
t[p].lmax = t[ls].len + t[rs].lmax;
}else{
t[p].lmax = t[ls].lmax;
}
if (t[rs].mmax == t[rs].len){
t[p].lmax = t[rs].len + t[ls].rmax;
}else{
t[p].lmax = t[rs].rmax;
}
t[p].mmax = max(max(t[ls].mmax, t[rs].mmax), t[ls].rmax + t[rs].lmax);
}
void push_down(int p){
if (t[p].lazy == -1) return;
if (t[p].lazy == 0){
t[ls].mmax = t[ls].lmax = t[ls].rmax = t[ls].sum = 0;
t[rs].mmax = t[rs].lmax = t[rs].rmax = t[rs].sum = 0;
t[ls].lazy = t[rs].lazy = 0;
}
if (t[p].lazy == 1){
t[ls].mmax = t[ls].lmax = t[ls].rmax = t[ls].sum = t[ls].len;
t[rs].mmax = t[rs].lmax = t[rs].rmax = t[rs].sum = t[rs].len;
t[ls].lazy = t[rs].lazy = 1;
}
t[p].lazy = -1;
}
void build(int p, int l, int r){
t[p].mmax = t[p].lmax = t[p].rmax = t[p].sum = t[p].len = r - l + 1;
t[p].lazy = -1;
if (l == r) return;
build(ls, l, mid);
build(rs, mid + 1, r);
}
void change(int p, int l, int r, int L, int R, int v){
push_down(p);
if (l >= L && r <= R){
t[p].mmax = t[p].lmax = t[p].rmax = t[p].sum = v * t[p].len;
t[p].lazy = v;
return;
}
if (L <= mid) change(ls, l, mid, L, R, v);
if (R > mid) change(rs, mid + 1, r, L, R, v);
push_up(p);
}
int ask(int p, int l, int r, int L){
push_down(p);
if (l == r) return l;
if (t[ls].mmax >= L) return ask(ls, l, mid, L);
if (t[ls].rmax + t[rs].lmax >= L){
return mid - t[ls].rmax + 1;
}else{
return ask(rs, mid + 1, r, L);
}
}
int main(){
int opt, x, y, n, m, ans;
scanf("%d%d", &n, &m);
build(1, 1, n);
for (int i = 1; i <= m; i++){
cin >> opt;
if (opt == 1){
scanf("%d", &x);
if (t[1].mmax >= x){
ans = ask(1, 1, n, x);
cout << ans << endl;
change(1, 1, n, ans, ans + x - 1, 0);
}else{ cout << 0 << endl;}
}else{
scanf("%d%d", &x, &y);
change(1, 1, n, x, x + y - 1, 1);
}
}
return 0;
}
这是之前的代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 2e6 + 1;
struct node{
int len, maxx, lmax, rmax, lazy, sum;
}a[maxn];
int n, m;
void build(int p, int l, int r){
a[p].lazy = 0;
a[p].len = a[p].maxx = a[p].lmax = a[p].rmax = (r - l + 1);
if (l == r) return;
int mid = (l + r) / 2;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
}
void push_down(int p){
if (a[p].lazy == 0) return;
if (a[p].lazy == 1){
a[p * 2].lazy = 1;
a[p * 2 + 1].lazy = 1;
a[p * 2].maxx = a[p * 2].lmax = a[p * 2].rmax = 0;
a[p * 2 + 1].maxx = a[p * 2 + 1].lmax = a[p * 2 + 1].rmax = 0;
}
if (a[p].lazy == 2){
a[p * 2].lazy = 2;
a[p * 2 + 1].lazy = 2;
a[p * 2].maxx = a[p * 2].lmax = a[p * 2].rmax = a[p * 2].len;
a[p * 2 + 1].maxx = a[p * 2 + 1].lmax = a[p * 2 + 1].rmax = a[p * 2 + 1].len;
}
a[p].lazy = 0;
}
void push_up(int p){
if (a[p * 2].maxx == a[p * 2].len){
a[p].lmax = a[p * 2].maxx + a[p * 2 + 1].lmax;
}else{
a[p].lmax = a[p * 2].lmax;
}
if (a[p * 2 + 1].maxx == a[p * 2 + 1].len){
a[p].rmax = a[p * 2 + 1].maxx + a[p * 2].rmax;
}else{
a[p].rmax = a[p * 2 + 1].rmax;
}
a[p].maxx = max(max(a[p * 2].maxx, a[p * 2 + 1].maxx), a[p * 2].rmax + a[p * 2 + 1].lmax);
}
void change(int p, int l, int r, int L, int R, int tag){
push_down(p);
if (L <= l && r <= R){
if (tag == 1){
a[p].lmax = 0;
a[p].rmax = 0;
a[p].maxx = 0;
}else{
a[p].lmax = a[p].len;
a[p].rmax = a[p].len;
a[p].maxx = a[p].len;
}
a[p].lazy = tag;
return;
}
int mid = (l + r) / 2;
if (L <= mid)change(p * 2, l, mid, L, R, tag);
if (R > mid) change(p * 2 + 1, mid + 1, r, L, R, tag);
push_up(p);
}
int ask(int p, int l, int r, int L){
push_down(p);
int mid = (l + r) / 2;
if (l == r) return l;
if (a[p * 2].maxx >= L){
return ask(p * 2, l, mid, L);
}
if (a[p * 2].rmax + a[p * 2 + 1].lmax >= L){
return mid - a[p * 2].rmax + 1;
}else{
return ask(p * 2 + 1, mid + 1, r, L);
}
}
int main(){
scanf("%d%d", &n, &m);
int opt, x, y, ans;
build(1, 1, n);
for (int i = 1; i <= m; i++){
scanf("%d", &opt);
if (opt == 1){
scanf("%d", &x);
if (a[1].maxx >= x){
ans = ask(1, 1, n, x);
printf("%d\n", ans);
change(1, 1, n, ans, ans + x - 1, 1);
}else{
printf("0\n");
}
}else{
scanf("%d%d", &x, &y);
change(1, 1, n, x, x + y - 1, 2);
}
}
return 0;
}
写的完全一样,但是现在这个一直wa,调破防了