ICode9

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

CF915E 动态开线段树

2019-07-24 22:55:49  阅读:249  来源: 互联网

标签:lazy int sr 线段 tre mid CF915E sl 动态


CF915E 动态开线段树

题面

因为\(n\le10^9\),所以动态开点,线段树维护\([1,n]\)天非工作日数量。

之前的结构体写法被卡了,只能改成函数传l,r(虽然也不难)

动态开点好写,但是太菜了线段树部分写炸了,对lazy标记理解不深,下放标记时注意不要把本来子区间的信息覆盖了,下放完标记后要把标记复原

#include <cstdio>
#define MAXN 15001000
#define mid ((xl+xr)>>1)
using namespace std;
int n,q;
int tot;
struct nod{
    int sl,sr,val;
    int lazy;
} tre[MAXN];
void build_nod(int &x, int l, int r, bool unwork){
    x=++tot;
    if(unwork) tre[x].val=r-l+1,tre[x].lazy=1;
    else tre[x].val=0,tre[x].lazy=-1;
}
void push_down(int x, int xl, int xr){
    if(tre[x].lazy==0) return;
    if(tre[x].lazy==1){
        if(tre[x].sl==0) build_nod(tre[x].sl, xl, mid, 1);
        else tre[tre[x].sl].val=(mid)-(xl)+1,tre[tre[x].sl].lazy=1;
        if(tre[x].sr==0) build_nod(tre[x].sr, mid+1, xr, 1);
        else tre[tre[x].sr].val=(xr)-(mid+1)+1,tre[tre[x].sr].lazy=1;
    }else{
        if(tre[x].sl==0) build_nod(tre[x].sl, xl, mid, 0);
        else tre[tre[x].sl].val=0,tre[tre[x].sl].lazy=-1;
        if(tre[x].sr==0) build_nod(tre[x].sr, mid+1, xr, 0);
        else tre[tre[x].sr].val=0,tre[tre[x].sr].lazy=-1;
    }
    tre[x].lazy=0;
}
void change(int &x, int xl, int xr, int l, int r, bool unwork){
    if(x==0){
        build_nod(x, l, r, unwork);
        return;
    }
    if(l<=xl&&xr<=r){
        if(unwork) tre[x].val=xr-xl+1,tre[x].lazy=1;
        else tre[x].val=0,tre[x].lazy=-1;
        return;
    }
    push_down(x, xl, xr);
    if(l<=mid) change(tre[x].sl, xl, mid,l, r, unwork);
    if(mid<r) change(tre[x].sr, mid+1, xr, l, r, unwork);
    tre[x].val=tre[tre[x].sl].val+tre[tre[x].sr].val;
}
int main()
{
    scanf("%d %d", &n, &q);
    int root=0;
    change(root, 1, n, 1, n, 0);
    while(q--){
        int l,r,k;
        scanf("%d %d %d", &l, &r, &k);
        if(k==1) change(root, 1, n, l, r, 1);
        else change(root, 1, n, l, r, 0);
        printf("%d\n", n-tre[root].val);
    }
    return 0;
}

标签:lazy,int,sr,线段,tre,mid,CF915E,sl,动态
来源: https://www.cnblogs.com/santiego/p/11241373.html

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

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

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

ICode9版权所有