CF915E 动态开线段树
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;
}
CF915E 动态开线段树的更多相关文章
- Find the median(2019年牛客多校第七场E题+左闭右开线段树)
题目链接 传送门 题意 每次往集合里面添加一段连续区间的数,然后询问当前集合内的中位数. 思路 思路很好想,但是卡内存. 当时写的动态开点线段树没卡过去,赛后机房大佬用动态开点过了,\(tql\). ...
- ligerui_ligerTree_005_动态增加“树”节点
动态添加ligerTree节点:效果图: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 <%@ page language= ...
- LuoguP2617 Dynamic Rankings (动态主席树学习理解)
题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...
- HDU1199 动态线段树 // 离散化
附动态线段树AC代码 http://acm.hdu.edu.cn/showproblem.php?pid=1199 因为昨天做了一道动态线段树的缘故,今天遇到了这题没有限制范围的题就自然而然想到了动态 ...
- HDU5367 思维map // 动态线段树
地主毛毛有n座山,这些山在地主家门前排成一条直线.这些山一开始均有相同的高度. 每一天,毛毛都会要求花花开挖机把几座山挖掉一定高度,或者给一些山堆上一些高度.并且要求花花报告现在有多少座山属于“高山 ...
- 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...
- 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)
没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...
- 在Asp.net core使用配置Json创建动态目录树
一.前言 使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在json配置文件中,再读取出来经过处理后生成目录树. 二.数据结构 1. TreeMenuNode类名 将TreeMenu ...
- 左闭右开线段树 2019牛客多校(第七场)E_Find the median(点代表区间
目录 题意 一种解析 AC_Code @(2019第七场牛客 E_Find the median 左闭右开线段树) 题意 链接:here 我理解的题意就是:初始序列为空,有\(n(400000)\)次 ...
随机推荐
- Idea 使用 Junit4 进行单元测试
目录 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安装 2. 编写测试代码 3. 生成测试类 4. 运行 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安 ...
- Java Web 深入分析(8) Servlet工作原理解析
Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态We ...
- Asp.Net Core 轻松学系列-5利用 Swagger 自动生成接口文档
目录 前言 结语 源码下载 前言 目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对 ...
- eclipse复制工作空间配置步骤
多个workspace,把每个workspace的设置共享,省去每次都重新配置一次. 总结一下,复制工作空间配置步骤如下: [最好是在新的workspace创建项目之前操作] 1 使用eclipse新 ...
- docker系列四之docker镜像与容器的常用命令
docker镜像与容器的常用命令 一.概述 docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...
- MySQL5.6.11安装步骤(Windows7 64位)
1. 下载MySQL Community Server 5.6.21,注意选择系统类型(32位/64位) 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下. 3. 添加环境变量 ...
- vue-filters(过滤器)
局部过滤器: <html> <head> <title>vue</title> <meta charset="utf-8"&g ...
- 前端理解控制反转ioc
工作一直都是写前端,而且都是偏业务的.相关的框架代码层面的了解还是有很大的缺失.一直想多写些维护性,可读性强的代码. 这段时间对控制反转ioc,这样的设计有了一个初步的了解. 前端为弱语言,平时代码的 ...
- XCode5环境下利用crash log调试线上Crash的流程
1.前言 本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题. 2. 步骤 (1)构造一段会crash的代码,并放到viewDidLoad ...
- MySQL Windows安装连接
1.首先进入mysql的安装目录下的bin目录,例如我的是[C:\WINDOWS\System32\cmd.exe] 2.接着输入cmd,回车 3.在命令行中输入命令[mysql -hlo ...