题意:

Alex高中毕业了,他现在是大学新生。虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外。快要期末了,但是不幸的Alex的体育学分还是零蛋!

Alex可不希望被开除,他想知道到期末还有多少天的工作日,这样他就能在这些日子里修体育学分。但是在这里计算工作日可不是件容易的事情:

从现在到学期结束还有 n 天(从 1 到 n 编号),他们一开始都是工作日。接下来学校的工作人员会依次发出 q 个指令,每个指令可以用三个参数 l,r,k 描述:

  • 如果 k=1,那么从 l 到 r (包含端点)的所有日子都变成非工作日。

  • 如果 k=2,那么从 l 到 rr(包含端点)的所有日子都变成工作日。

帮助Alex统计每个指令下发后,剩余的工作日天数。

输入格式:

第一行一个整数 n,第二行一个整数 q (1≤n≤109,1≤q≤3⋅105),分别是剩余的天数和指令的个数。

接下来 q 行,第 i 行有 3 个整数 li​,ri​,ki​,描述第 i 个指令 (1≤li​,ri​≤n,1≤k≤2)。

输出格式:

输出 q 行,第 i 行表示第 i 个指令被下发后剩余的工作日天数。

Translated by 小粉兔

题目描述

This year Alex has finished school, and now he is a first-year student of Berland State University. For him it was a total surprise that even though he studies programming, he still has to attend physical education lessons. The end of the term is very soon, but, unfortunately, Alex still hasn't attended a single lesson!

Since Alex doesn't want to get expelled, he wants to know the number of working days left until the end of the term, so he can attend physical education lessons during these days. But in BSU calculating the number of working days is a complicated matter:

There are nn days left before the end of the term (numbered from 11 to nn ), and initially all of them are working days. Then the university staff sequentially publishes qq orders, one after another. Each order is characterised by three numbers ll , rr and kk :

  • If k=1k=1 , then all days from ll to rr (inclusive) become non-working days. If some of these days are made working days by some previous order, then these days still become non-working days;
  • If k=2k=2 , then all days from ll to rr (inclusive) become working days. If some of these days are made non-working days by some previous order, then these days still become working days.

Help Alex to determine the number of working days left after each order!

输入输出格式

输入格式:

The first line contains one integer nn , and the second line — one integer qq ( 1<=n<=10^{9}1<=n<=109, 1<=q<=3·10^{5}1<=q<=3⋅105 ) — the number of days left before the end of the term, and the number of orders, respectively.

Then qq lines follow, ii -th line containing three integers l_{i}li​ , r_{i}ri​ and k_{i}ki​ representing ii -th order ( 1<=l_{i}<=r_{i}<=n1<=li​<=ri​<=n , 1<=k_{i}<=21<=ki​<=2 ).


输出格式:

Print qq integers. ii -th of them must be equal to the number of working days left until the end of the term after the first ii orders are published.

输入输出样例

输入样例#1:

4
6
1 2 1
3 4 1
2 3 2
1 3 2
2 4 1
1 4 2
输出样例#1:

2
0
2
3
1
4

Solution:

  本题动态开点线段树。

  题目和那个开关灯的用线段树解决的问题是一样的,只不过区间范围比那个大。

  对于本题当然可以离散化,但更为简单的就是动态开点了。

  我们对于每次修改的一段区间,都在$[1,n]$范围内二分,对于没有建节点的区间就兴建节点维护,然后加上懒惰标记,记得下放标记时也得判断子节点有无并动态开节点就好了。(注意,空间一定得开大,粗略的算下得开到$2\log n$倍$q$)

代码:

/*Code by 520 -- 9.25*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m,root,cnt;
int ls[N*],rs[N*],sum[N*],lazy[N*]; int gi(){
int a=;char x=getchar();
while(x<''||x>'') x=getchar();
while(x>=''&&x<='') a=(a<<)+(a<<)+(x^),x=getchar();
return a;
} il void pushup(int rt){sum[rt]=sum[ls[rt]]+sum[rs[rt]];} il void pushdown(int l,int r,int rt){
if(~lazy[rt]){
if(l!=r) {
if(!ls[rt]) ls[rt]=++cnt;
if(!rs[rt]) rs[rt]=++cnt;
lazy[ls[rt]]=lazy[rt],
lazy[rs[rt]]=lazy[rt];
sum[ls[rt]]=((l+r>>)-l+)*lazy[rt];
sum[rs[rt]]=(r-(l+r>>))*lazy[rt];
}
lazy[rt]=-;
}
} void update(int L,int R,int x,int l,int r,int &rt){
if(!rt) rt=++cnt;
if(L<=l&&R>=r){lazy[rt]=x;sum[rt]=(r-l+)*x;return;}
pushdown(l,r,rt);
int m=l+r>>;
if(L<=m) update(L,R,x,l,m,ls[rt]);
if(R>m) update(L,R,x,m+,r,rs[rt]);
pushup(rt);
} int main(){
memset(lazy,-,sizeof(lazy));
n=gi(),m=gi();
int x,y,z;
while(m--){
x=gi(),y=gi(),z=gi();
if(z==) update(x,y,,,n,root);
else update(x,y,,,n,root);
printf("%d\n",n-sum[]);
}
return ;
}

CF915E Physical Education Lessons的更多相关文章

  1. CF915E Physical Education Lessons 动态开点线段树

    题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...

  2. 【题解】Luogu CF915E Physical Education Lessons

    原题传送门:CF915E Physical Education Lessons 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 这道题很简单啊 每个操作就是区间赋值,顺带把总和修 ...

  3. CF915E Physical Education Lessons 珂朵莉树

    问题描述 CF915E LG-CF915E 题解 \(n \le 10^9\) 看上去非常唬人. 但是这种区间操作的题,珂朵莉树随便跑啊. \(\mathrm{Code}\) #include< ...

  4. CF915E Physical Education Lessons(珂朵莉树)

    中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstd ...

  5. Codeforces 915E Physical Education Lessons

    原题传送门 我承认,比赛的时候在C题上卡了好久(最后也不会),15min水掉D后(最后还FST了..),看到E时已经只剩15min了.尽管一眼看出是离散化+线段树的裸题,但是没有时间写,实在尴尬. 赛 ...

  6. 【CodeForces】915 E. Physical Education Lessons 线段树

    [题目]E. Physical Education Lessons [题意]10^9范围的区间覆盖,至多3*10^5次区间询问. [算法]线段树 [题解]每次询问至多增加两段区间,提前括号分段后线段树 ...

  7. Codeforces 915 E Physical Education Lessons

    题目描述 This year Alex has finished school, and now he is a first-year student of Berland State Univers ...

  8. Physical Education Lessons CodeForces - 915E (动态开点线段树)

    Physical Education Lessons CodeForces - 915E This year Alex has finished school, and now he is a fir ...

  9. Codeforces 915E. Physical Education Lessons(动态开点线段树)

    E. Physical Education Lessons 题目:一段长度为n的区间初始全为1,每次成段赋值0或1,求每次操作后的区间总和.(n<=1e9,q<=3e5) 题意:用线段树做 ...

随机推荐

  1. 通过Task异步加快对数组的运算

    一.介绍 Task是.NetFramework3.0出现的,线程是基于线程池,然后提供了丰富的API. 先用AverageAssign方法把一组数据平均分成n组,再通过遍历n组数据,循环开Task多线 ...

  2. 接口自动化学习--mock

    好久没有写学习的总结,都正月十二了,但还是要来个新年快乐鸭. 一直都在看imooc的一套java接口自动化实战课程,现在看到了尾部了,然后想到之前那些testng,mock,httpclient等都没 ...

  3. InnoDB表优化

    InnoDB表存储优化 适时的使用 OPTIMIZE TABLE 语句来重组表,压缩浪费的表空间.这是在其它优化技术不可用的情况下最直接的方法. OPTIMIZE TABLE 语句通过拷贝表数据并重建 ...

  4. python 思维导图-linux命令

    linux基础 linux关于文件/目录的终端命令 linux关于文件内容处理的终端命令

  5. 绝对干货!初学者也能看懂的DPDK解析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...

  6. 深入理解Java类加载器(ClassLoader) (转)

    转自: http://blog.csdn.net/javazejian/article/details/73413292 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Ja ...

  7. 随手记录-linux-添加epel源

    下载各种yum源 https://opsx.alibaba.com/mirror https://blog.csdn.net/harbor1981/article/details/51135623

  8. 20172319 《Java程序设计教程》 第10周学习总结

    20172319 2018.05.09-05.21 <Java程序设计教程>第10周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周 ...

  9. iOS开发学习-给圆形图片添加边框

    imageView.layer.cornerRadius = imageView.bounds.size.width * 0.5;// 设置圆角刚好是自身宽度的一半,就刚好是圆形 imageView. ...

  10. 重温servlet①

    Servlet是单例的,是线程不安全的.比较灵活,但是容易会使两个线程产生错误 类由我们自己来写,对象由服务器生成,方法由服务器自己调用.   一个servletconfig对象对应着一段web.xm ...