线段树20分求条
查看原帖
线段树20分求条
1034698
jzy_CSPJ_AK楼主2025/2/5 08:31

AC on #1 #3

#include <bits/stdc++.h>
#define lid (id << 1)
#define rid (id << 1 | 1)
using namespace std;
using ll = long long;
constexpr int MAXN = 5e6 + 1145;
constexpr int root = 1;

struct Node {
    int len, tag, lmax, rmax, sum;
} t[MAXN];

int a, b, p;

namespace sgt {
	void merge(int id) {
	    t[id].lmax = (t[lid].lmax == t[lid].len) ? (t[lid].len + t[rid].lmax) : t[lid].lmax;
	    t[id].rmax = (t[rid].rmax == t[rid].len) ? (t[rid].len + t[lid].rmax) : t[rid].rmax;
	    t[id].sum = max(t[lid].rmax + t[rid].lmax, max(t[lid].sum, t[rid].sum));
	}
	
	void build(int id, int l, int r) {
	    t[id].sum = t[id].len = t[id].lmax = t[id].rmax = r - l + 1;
	    if (l == r) return;
	    int mid = (l + r) >> 1;
	    build(lid, l, mid), build(rid, mid + 1, r);
	}
	
	void push_down(int id, int l, int r) {
	    if (t[id].tag == 0)
	        return;
	    int mid = l + r >> 1;
	    t[lid].tag = t[rid].tag = t[id].tag;
	    t[lid].sum = t[lid].lmax = t[lid].rmax = (t[id].tag == 1) ? t[lid].len : 0;
	    t[rid].sum = t[rid].rmax = t[rid].rmax = (t[id].tag == 1) ? t[rid].len : 0;
	}
	
	int qry(int x, int id, int cl, int cr) {
	    if (cl == cr)
	        return cl;
	    push_down(id, cl, cr);
	    int mid = cl + cr >> 1;
	    if (t[lid].sum >= x)
	        return qry(x, lid, cl, mid);
	    if (t[lid].rmax + t[rid].lmax >= x)
	        return mid - t[lid].rmax + 1;
	    return qry(x, rid, mid + 1, cr);
	}
	
	void modify(int l, int r, int x, int id, int cl, int cr) {
	    if (cl > r || cr < l)
	        return;
	    if (l <= cl && cr <= r) {
	        t[id].sum = t[id].lmax = t[id].rmax = (x == 1) ? t[id].len : 0;
	        t[id].tag = x;
	        return;
	    }
	    push_down(id, cl, cr);
	    int mid = cl + cr >> 1;
	    modify(l, r, x, lid, cl, mid);
	    modify(l, r, x, rid, mid + 1, cr);
	    merge(id);
	}
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m, ans = 0;
    char c;
    cin >> n >> m;
    sgt::build(root, 1, n);
    for (int i = 1; i <= m; i++) {
        cin >> c;
        if (c == 'L') {
            cin >> a >> b;
            sgt::modify(a, b, 1, root, 1, n);
        } else {
            cin >> p;
            if (t[root].sum >= p) {
                int ans_l = sgt::qry(p, root, 1, n);
                sgt::modify(ans_l, ans_l + p - 1, 2, root, 1, n);
            } else
                ans++;
        }
    }
    cout << ans;
    return 0;
}
2025/2/5 08:31
加载中...