站外题线段树无输出求调
  • 板块题目总版
  • 楼主ChampionCyan
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/20 12:57
  • 上次更新2025/1/20 15:13:49
查看原帖
站外题线段树无输出求调
1036180
ChampionCyan楼主2025/1/20 12:57

题目地址:https://atcoder.jp/contests/abc389/tasks/abc389_f

#include <stdio.h>
using namespace std;
const int MAXN = 500001;

char gc() {
    static char buf[1048576], *p1, *p2;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1048576, stdin), p1 == p2) ? EOF : *p1++;
}

int read() {
    int x = 0;
    char ch = gc();
    while (ch < '0' || ch > '9')
        ch = gc();
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = gc();
    }
    return x;
}

class SegmentTree {
    private:
        int tree[MAXN << 2], lazy[MAXN << 2];
        int lcp(int p) {
            return p << 1;
        }
        int rcp(int p) {
            return (p << 1) + 1;
        }
        int mid(int l, int r) {
            return (l + r) >> 1;
        }
        void under(int p, int l, int r) {
            lazy[p] = 0;
            if (l == mid(l, r))
                tree[lcp(p)]++;
            else
                lazy[lcp(p)] = 1;
            if (r == mid(l, r) + 1)
                tree[rcp(p)]++;
            else
                lazy[rcp(p)] = 1;
        }
    public :
        void build(int p = 1, int l = 1, int r = 500000) {
            if (l == r) {
                tree[p] = l;
                return;
            }
            build(lcp(p), l, mid(l, r)), build(rcp(p), mid(l, r) + 1, r);
        }
        void add(int il, int ir, int p = 1, int l = 1, int r = 500000) {
            if (ir < l || il > r)
                return;
            if (il <= l && ir >= r) {
                lazy[p] = 1;
                return;
            }
            add(lcp(p), il, ir, l, mid(l, r)), add(rcp(p), il, ir, mid(l, r) + 1, r);
        }
        int query(int pos, int p = 1, int l = 1, int r = 500000) {
            if (l == r)
                return tree[p];
            if (lazy[p])
                under(p, l, r);
            if (pos <= mid(l, r))
                return query(lcp(p), pos, l, mid(l, r));
            else
                return query(rcp(p), pos, mid(l, r) + 1, r);
        }
        int ml(int val, int p = 1, int l = 1, int r = 500000) {
            while (l <= r)
                if (query(mid(l, r)) >= val)
                    r = mid(l, r) - 1;
                else
                    l = mid(l, r) + 1;
            return l;
        }
        int mr(int val, int p = 1, int l = 1, int r = 500000) {
            while (l <= r)
                if (query(mid(l, r)) <= val)
                    r = mid(l, r) - 1;
                else
                    l = mid(l, r) + 1;
            return l;
        }
} t;

int main() {
    int n = read();
    t.build();
    while (n--)
        t.add(t.ml(read()), t.mr(read()));
    int q = read();
    while (q--)
        printf("%d\n", t.query(read()));
    return 0;
}
2025/1/20 12:57
加载中...