求助线段树模板题,和之前写的AC代码一模一样但是0pts
查看原帖
求助线段树模板题,和之前写的AC代码一模一样但是0pts
347839
Daniel_7216楼主2024/10/25 00:28

如题。 这是我现在的代码:

#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,调破防了

2024/10/25 00:28
加载中...