矩阵线段树16pts求调
查看原帖
矩阵线段树16pts求调
486799
BlackPanda楼主2024/8/3 12:21
#include <bits/stdc++.h>
using namespace std;
/*====================*/
#define ios_close ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
#define yes puts("Yes")
#define no puts("No")
#define lowbit(x) (x) & (-x)
#define inf 0x3f3f3f3f
#define endl "\n"
#define PII pair<int, int>
typedef long long LL;
/*====================*/
const int MOD = 1e9 + 7;
const int N = 2e5 + 10;
/*====================*/
int n, q, arr[N << 2];
/*====================*/
/*====================*/
struct Tree
{
    int l, r;
    int sum, lsum, rsum, maxsum;
    Tree(int _l = 0, int _r = 0, int d = 0)
    {
        l = _l; r = _r;
        sum = lsum = rsum = maxsum = d;
    }
    friend Tree operator + (const Tree& a, const Tree& b)
    {
        Tree res;
        res.l = a.l;
        res.r = b.r;
        res.lsum = a.lsum;
        res.rsum = b.rsum;
        res.maxsum = max(a.maxsum, b.maxsum);
        if (arr[a.r] != arr[b.l])
        {
            res.lsum = max(a.lsum, a.sum + b.lsum);
            res.rsum = max(b.rsum, b.sum + a.rsum);
            res.maxsum = max(res.maxsum, a.rsum + b.lsum);
            res.sum = a.sum + b.sum;
        }
        return res;
    }
};
Tree tree[N << 2];
int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }
void PushUp(int p)
{
    tree[p] = tree[ls(p)] + tree[rs(p)];
}
void Build(int p, int l, int r)
{
    tree[p].l = l; tree[p].r = r;
    if (tree[p].l == tree[p].r)
    {
        arr[l] = 0;
        tree[p] = Tree(l, r, 1); // 'L'
    }
    else
    {
        int mid = (tree[p].l + tree[p].r) >> 1;
        Build(ls(p), l, mid + 0);
        Build(rs(p), mid + 1, r);
        PushUp(p);
    }
}
void Change(int p, int x)
{
    if (tree[p].l != tree[p].r)
    {
        int mid = (tree[p].l + tree[p].r) >> 1;
        if (x <= mid)Change(ls(p), x);
        if (mid < x) Change(rs(p), x);
        PushUp(p);
    }
}
// void Ask(int p, int l, int r, vector<int>& lib)
// {
//     if (l <= tree[p].l && tree[p].r <= r)
//     {
//         lib.push_back(p);
//     }
//     else
//     {
//         int mid = (tree[p].l + tree[p].r) >> 1;
//         if (l <= mid)Ask(ls(p), l, r, lib);
//         if (mid < r) Ask(rs(p), l, r, lib);
//     }
// }
// int Ask(int l, int r)
// {
//     vector<int> lib;
//     Ask(1, l, r, lib);
//     Tree ans = tree[lib[0]];
//     for (int i = 1; i < lib.size(); i++)
//     {
//         ans = ans + tree[lib[i]];
//     }
//     return ans.maxsum;
// }
/*====================*/
void Solve()
{
    cin >> n >> q;
    Build(1, 1, n);
    while (q--)
    {
        int x; cin >> x;
        arr[x] ^= 1;
        Change(1, x);
        //      cout << Ask(1, n) << endl;
        cout << tree[1].maxsum << endl;
    }
    return;
}
/*====================*/
signed main()
{
    ios_close;
    int _ = 1; /* cin >> _; */
    while (_--)
        Solve();
    return 0;
}
2024/8/3 12:21
加载中...