站外题求助
  • 板块学术版
  • 楼主anonymous217
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/2/27 20:18
  • 上次更新2023/10/28 07:34:20
查看原帖
站外题求助
217634
anonymous217楼主2022/2/27 20:18

传送门

#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <bitset>
#include <math.h>
#define int long long
using namespace std;
const int N = 100005;
const int SS = 400;
const int CO = 40;
int col[N], L[SS], R[SS], tag[N];
bitset<CO>c[SS];
int n, t, q;
int ts;
void pre() {
    L[0] = 0;

    for (int i = 1; i <= n; i++) {
        col[i] = 1;
    }

    for (int i = 1; i <= ts; i++) {
        L[i] = L[i - 1] + 1;
        R[i] = ts * i;
        c[i].set(1);
    }

    if (R[ts] != n) {
        R[ts + 1] = n;
        L[ts + 1] = R[ts] + 1;
        c[ts + 1].set(1);
    }

    return;
}
void pc(int id, int l, int r, int k) {
    if (tag[id] != 0) {
        for (int i = L[id]; i <= R[id]; i++) {
            col[i] = tag[id];
        }

        tag[id] = 0;
    }

    for (int i = l; i <= r; i++)
        col[i] = k;

    c[id].reset();

    for (int i = L[id]; i <= R[id]; i++)
        c[id].set(col[i]);

    return;
}
int query(int f, int t) {
    int atf = ceil(f / SS), att = ceil(t / SS);
    bitset<CO>b;

    if (atf == att) {
        if (tag[atf] != 0)
            return 1;

        int c;

        for (int i = f; i <= t; i++)
            b.set(col[i]);

        return b.count();
    }

    if (tag[atf] != 0)
        b.set(tag[atf]);
    else
        for (int i = f; i <= R[atf]; i++)
            b.set(col[i]);

    if (tag[att] != 0)
        b.set(tag[att]);
    else
        for (int i = L[att]; i <= t; i++)
            b.set(col[i]);

    for (int i = atf + 1; i < att; i++)
        b |= c[i];

    return b.count();
}
void update(int f, int t, int k) {
    int atf = ceil(f / SS), att = ceil(t / SS);

    if (atf == att) {
        pc(atf, f, t, k);
        return;
    }

    pc(atf, f, R[atf], k);
    pc(att, L[att], t, k);

    for (int i = atf + 1; i < att; i++)
        tag[i] = k;

    return;
}
signed main() {
    cin >> n >> t >> q;
    ts = sqrt(n);
    pre();

    for (int i = 1; i <= q; i++) {
        char opt;
        int l, r, v;
        cin >> opt;
        scanf("%lld%lld", &l, &r);

        if (opt == 'C') {
            scanf("%lld", &v);
            update(l, r, v);
        }

        if (opt == 'P') {
            cout << query(l, r) << endl;
        }
    }
}
2022/2/27 20:18
加载中...