ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CF915E] Physical Education Lessons - 动态开点线段树

2021-04-10 21:33:14  阅读:199  来源: 互联网

标签:Lessons ch int sum mid read tag CF915E Education


[CF915E] Physical Education Lessons - 动态开点线段树

Description

有 n 天(一开始都是工作日),之后会发布 q 个通知,通知的格式为:l r k。如果 k=1,就说明从第 l 天到第 r 天都变成非工作日;如果 k=2,就说明从第 l 天到第 r 天都变成工作日,每次操作后问有多少个工作日。

Solution

复习一下动态开点线段树,常数有点紧,空间大概要到 \(1.5\times 10^7\),需要 FASTIO

#include <bits/stdc++.h>
using namespace std;

const int N = 1.5e7;

int sum[N], tag[N], ch[N][2], ind, n, q, root;

#define LEFT ch[p][0], l, mid
#define RIGHT ch[p][1], mid + 1, r
#define MID ((l + r) >> 1)

inline int read()
{
    int x(0);
    char c = getchar();
    while (!isdigit(c))
        c = getchar();
    while (isdigit(c))
        x = (x * 10) + (c ^ 48), c = getchar();
    return x;
}

void pushup(int p)
{
    sum[p] = sum[ch[p][0]] + sum[ch[p][1]];
}

void pushdown(int p, int l, int r)
{
    if (tag[p])
    {
        int mid = MID;
        if (ch[p][0] == 0)
            ch[p][0] = ++ind;
        if (ch[p][1] == 0)
            ch[p][1] = ++ind;
        sum[ch[p][0]] = (mid - l + 1) * (2 - tag[p]);
        sum[ch[p][1]] = (r - mid) * (2 - tag[p]);
        tag[ch[p][0]] = tag[ch[p][1]] = tag[p];
        tag[p] = 0;
    }
}

void modify(int &p, int l, int r, int ql, int qr, int v)
{
    int mid = MID;
    if (l > qr || r < ql)
        return;
    if (!p)
        p = ++ind;
    if (l >= ql && r <= qr)
    {
        tag[p] = v;
        sum[p] = (r - l + 1) * (2 - tag[p]);
    }
    else
    {
        pushdown(p, l, r);
        if (ql <= mid)
            modify(LEFT, ql, qr, v);
        if (qr > mid)
            modify(RIGHT, ql, qr, v);
        pushup(p);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    n = read();
    q = read();
    root = ++ind;
    while (q--)
    {
        int l, r, k;
        l = read();
        r = read();
        k = read();
        modify(root, 1, n, l, r, k);
        printf("%d\n", n - sum[1]);
    }
}

标签:Lessons,ch,int,sum,mid,read,tag,CF915E,Education
来源: https://www.cnblogs.com/mollnn/p/14642183.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有