题目描述

  $D$先生,是一个了不起的甜甜圈制造商。今天,他的厨房准备在日出之前制作甜甜圈。$D$先生瞬间完成了$N$个油炸圈饼。但是,这些油炸圈饼得先经过各种装饰任务才可以成为甜甜圈销售:填充奶油,浸入巧克力,打顶可爱,丰富多彩的东西等等。
  装饰任务有$K$个,任务编号为$1$到$K$,并且每一个甜甜圈都必须严格按照$K$个任务以$1,2,...,K$的顺序仅完成一次,才能成为销售物品。
  $D$先生将$N$个甜甜圈排成一列,他似乎打算一次完成每个装饰任务。但是,昨天晚上熬夜的$D$先生每个任务只装饰了部分连续区间的甜甜圈。这显然是一个错误!不仅如此,他还可能是做了几次同一任务,任务的顺序也是混乱的。
  没有经过正确流程装饰的甜甜圈不能作为销售物品提供,所以他应该把它们丢掉。幸运的是,有数据依次记录了他所做的一系列任务。数据包含以下信息:对于每个任务,装饰的甜甜圈的连续区间$[l,r]$和任务的$ID\ x$。
  请编写一个程序,列举可在展示柜中显示的甜甜圈的数量,作为销售给定记录数据的答案。


输入格式

第一行两个整数$N$和$K$,表示有$N$个甜甜圈和$K$个任务。
第二行一个整数$T$,表示$D$先生依次完成了$T$个区间的装饰。
接下来$T$行,每行三个正整数$l_i,r_i,x_i$,分别表示区间$[l_i,r_i]$的甜甜圈完成了$ID$为$x_i$的装饰任务。


输出格式

一个整数,表示能作为展示的甜甜圈的数量。


样例

样例输入:

5 3
5
2 3 1
1 3 2
4 5 1
2 4 3
3 5 2

样例输出:

1


数据范围与提示

样例解释:

$1$号甜甜圈没有完成任务$1$就完成了任务$2$所以抛弃,$3$号甜甜圈的任务$2$被重复完成了$2$次,抛弃!$4$号甜甜圈先完成了任务$3$再完成任务$2$,抛弃!$5$号甜甜圈没有完成任务$3$,抛弃!所以只有$2$可以展示。

数据范围:

对于$40\%$的数据,$N,K,T\leqslant 5,000$
对于另外$20\%$的数据,$K\leqslant 100$
对于另外$10\%$的数据,$l_i=r_i$
对于$100\%$的数据,$1\leqslant N,K,T\leqslant 200,000,x_i\leqslant K,1\leqslant l_i\leqslant r_i\leqslant N$


题解

显然是一道线段树,我们考虑如何维护。

用两个懒标记,分别表示其上端点和下端点,$-1$表示没有懒标记,$-2$表示这段区间已经不合法即可。

最后将整棵树跑一边即可统计答案。

时间复杂度:$\Theta(N\log N+T\log N)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
int N,K,T;
int tr[1000000],lz1[1000000],lz2[1000000];
int ans;
void build(int x,int l,int r)
{
lz1[x]=lz2[x]=-2;
if(l==r)return;
int mid=(l+r)>>1;
build(L(x),l,mid);
build(R(x),mid+1,r);
}
void pushdown(int x)
{
if(lz1[x]==-2)return;
if(lz1[x]==-1)
{
tr[L(x)]=tr[R(x)]=lz1[L(x)]=lz1[R(x)]=lz2[L(x)]=lz2[R(x)]=-1;
return;
}
if(tr[L(x)]!=-1)
{
if(tr[L(x)]+1==lz1[x])tr[L(x)]=lz2[x];
else tr[L(x)]=-1;
}
if(tr[R(x)]!=-1)
{
if(tr[R(x)]+1==lz1[x])tr[R(x)]=lz2[x];
else tr[R(x)]=-1;
}
if(lz1[L(x)]!=-1)
{
if(lz1[L(x)]==-2){lz1[L(x)]=lz1[x];lz2[L(x)]=lz2[x];}
else if(lz2[L(x)]+1==lz1[x])lz2[L(x)]=lz2[x];
else lz1[L(x)]=lz2[L(x)]=-1;
}
if(lz1[R(x)]!=-1)
{
if(lz1[R(x)]==-2){lz1[R(x)]=lz1[x];lz2[R(x)]=lz2[x];}
else if(lz2[R(x)]+1==lz1[x])lz2[R(x)]=lz2[x];
else lz1[R(x)]=lz2[R(x)]=-1;
}
lz1[x]=lz2[x]=-2;
}
void change(int x,int l,int r,int L,int R,int w)
{
if(r<L||R<l)return;
if(L<=l&&r<=R)
{
if(tr[x]!=-1)
{
if(tr[x]+1==w)tr[x]++;
else tr[x]=-1;
}
if(lz1[x]!=-1)
{
if(lz1[x]==-2)lz1[x]=lz2[x]=w;
else if(lz2[x]+1==w)lz2[x]++;
else lz1[x]=lz2[x]=-1;
}
return;
}
pushdown(x);
int mid=(l+r)>>1;
change(L(x),l,mid,L,R,w);
change(R(x),mid+1,r,L,R,w);
}
void ask(int x,int l,int r)
{
if(l==r)
{
if(tr[x]==K)ans++;
return;
}
pushdown(x);
int mid=(l+r)>>1;
ask(L(x),l,mid);
ask(R(x),mid+1,r);
}
int main()
{
scanf("%d%d%d",&N,&K,&T);
build(1,1,N);
while(T--)
{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
change(1,1,N,l,r,x);
}
ask(1,1,N);
printf("%d",ans);
return 0;
}

rp++

[CSP-S模拟测试]:甜圈(线段树)的更多相关文章

  1. [CSP-S模拟测试]:Weed(线段树)

    题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...

  2. [CSP-S模拟测试]:光线追踪(线段树)

    题目背景 初中时的乔猫试着组建了$NEWorld$开发组,可是不久之后却因为合作上的问题(和乔猫工程水平差,代码混乱的问题),开发组成员之间常常产生矛盾,关系越来越不如以前......一年下来,受到长 ...

  3. [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)

    题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...

  4. [CSP-S模拟测试]:bird(线段树优化DP)

    题目传送门(内部题89) 输入格式 第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间.接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标. 输出格式 输出一个 ...

  5. [CSP-S模拟测试]:string(线段树)

    题目描述 给定一个由小写字母组成的字符串$s$. 有$m$次操作,每次操作给定$3$个参数$l,r,x$. 如果$x=1$,将$s[l]~s[r]$升序排序: 如果$x=0$,将$s[l]~s[r]$ ...

  6. [CSP-S模拟测试]:Permutation(线段树+拓扑排序+贪心)

    题目描述 你有一个长度为$n$的排列$P$与一个正整数$K$你可以进行如下操作若干次使得排列的字典序尽量小对于两个满足$|i−j|\geqslant K$且$|P_i−P_j|=1$的下标$i$与$j ...

  7. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  8. Codeforces 280D k-Maximum Subsequence Sum [模拟费用流,线段树]

    洛谷 Codeforces bzoj1,bzoj2 这可真是一道n倍经验题呢-- 思路 我首先想到了DP,然后矩阵,然后线段树,然后T飞-- 搜了题解之后发现是模拟费用流. 直接维护选k个子段时的最优 ...

  9. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

随机推荐

  1. 【ABAP系列】SAP ABAP 模拟做成像windows一样的计算器

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP 模拟做成像wind ...

  2. 分布式 vs 集群 主从 vs 集群

      理解 分布式 一个业务拆分成多个子业务,部署在不同的服务器上 集群 同一个业务部署在多个服务器上   更新 主从 服务器之间更新是异步的,从服务器可能和主服务器不一致 集群 更新是同步的,数据节点 ...

  3. Console.Out 属性和 XmlDocument.Save 方法 (String)

    Console.Out 属性 默认情况下,此属性设置为标准输出流. 此属性可以设置为另一个流SetOut方法. 请注意,调用Console.Out.WriteLine方法是等效于调用相应WriteLi ...

  4. jQuery架构设计与实现(2.1.4版本)

    市面上的jQuery书太多了,良莠不齐,看了那么多总觉得少点什么 对"干货",我不喜欢就事论事的写代码,我想把自己所学的知识点,代码技巧,设计思想,代码模式能很好的表达出来,所以考 ...

  5. POJ-2456.Aggressivecows.(二分求解最大化最小值)

    本题大意:在坐标轴上有n个点,现在打算在这n个点上建立c个牛棚,由于牛对厂主的分配方式表示很不满意,它很暴躁,所以它会攻击离它很近的牛来获得快感,这件事让厂主大大知道了,他怎么可能容忍?所以他决定有策 ...

  6. 饿了吗开源组件库Element模拟购物车系统

    传统的用html+jquery来实现购物车系统要非常的复杂,但是购物车系统完全是一个数据驱动的系统,因此采用诸如Vue.js.angular.js这些框架要简单的多.饿了吗开源的组件库Element是 ...

  7. 问题 J: 老肖数等式

    问题 J: 老肖数等式 时间限制: 1 Sec  内存限制: 128 MB提交: 1594  解决: 741[提交] [状态] [命题人:jsu_admin] 题目描述 老肖前几年当了小学数学老师,他 ...

  8. IIS是怎么处理多个请求的?

      一,假设有一台服务器,它的IIS上部署有一个Web应用程序-S,可以通过浏览器或其他方式进行访问.     假设有A.B.C三台电脑同时访问网站S,IIS接收到3个HTTP请求,然后分别为三个请求 ...

  9. 帝国CMS链接域名重写、伪静态处理

    需求:将 www.abc.com/e/tags?tagsid=1 改写成  www.abc.com/softlink/1.html形式: 环境:Windows服务器: 路径:D:/web/www.ab ...

  10. vue.js(16)--vue的组件

    注册一个全局组件 <div id="app"> <test></test> </div> <script> // 注册全 ...