NC14583 糖糖别胡说,我真的不是签到题目

题目

题目描述

从前,有 \(n\) 只萌萌的糖糖,他们分成了两组一起玩游戏。他们会排成一排,第 \(i\) 只糖糖会随机得到一个能力值 \(b_i\)。从第 \(i\) 秒的时候,第 \(i\) 只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。

为了使游戏更加有趣,糖糖的爸爸,娇姐,会发功 \(m\) 次,第 \(i\) 次发功的时间为 \(c_i\) ,则在第 \(c_i\) 秒结束后 \(b_1,b_2,.....,b_{c_i}\) 都会增加 \(1\) 。

现在,娇姐想知道在第 \(n\) 秒后,会有多少只糖糖存活下来。

输入描述

第一行只有一个整数 \(T\)(\(T<6\)) ,表示测试数据的组数。

第二行有两个整数 \(n,m\) 。表示糖糖的个数以及娇姐发功的次数。(\(1 \leq n\leq 50000,1 \leq b_i \leq 1000000\))

第三行到 \(n+2\) 行,每行有两个整数 \(a_i,b_i\) ,表示第 \(i\) 只糖糖属于那一组以及他的能力值。(\(0\leq a_i \leq 1,1\leq b_i\leq 1000000\))

第 \(n+3\) 行到第 \(n+m+2\) 行,每行有一个整数 \(c_i\) ,表示GTW第 \(i\) 次发功的时间.(\(1\leq c_i \leq n\))

输出描述

总共 \(T\) 行,第 \(i\) 行表示第 \(i\) 组数据中,糖糖存活的个数。

示例1

输入

1
4 3
0 3
1 2
0 3
1 1
1
3
4

输出

3

题解

思路

知识点:后缀最大值+差分。

每一只糖糖的状态之和后面的糖糖有关,从正向遍历每次要重复考虑之前区间糖糖的状态,从反向遍历可以通过更新已遍历区间的最大值来决定遍历到的糖糖的状态。

第 \(i\) 次发功后会造成 \([0,c_i]\) 糖糖数值加一,显然每次增加不会影响后面的糖糖状态。正向遍历每次都给对应区间整体加一,不能满足复杂度;反向遍历用 \(delta\) 来记录到某个糖糖为止增加的次数,从而在之后用 \(b_i+delta\) 代替 \(b_i\) 达到增加的效果。

时间复杂度 \(O(n+m)\)

空间复杂度 \(O(n+m)\)

代码

#include <bits/stdc++.h>

using namespace std;

bool a[50007];
int b[50007];
int c[50007]; int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
for(int i = 1;i<=n;i++){
c[i] = 0;
cin>>a[i]>>b[i];
}
for(int i = 0;i<m;i++){
int tmp;
cin>>tmp;
c[tmp]++;
} int delta = 0,ans = n,max0 = 0,max1 = 0;
///一个糖糖的死活只和后面糖糖最大值有关
for(int i = n;i>=1;i--){
delta+=c[i];///区间增值是向前的,所以可以逆向累加
if(a[i]){
ans -= (b[i]+delta)<max0;
max1 = max(b[i]+delta,max1);
}
else{
ans -= (b[i]+delta)<max1;
max0 = max(b[i]+delta,max0);///更新最大值为当前值+增值
}
}
cout<<ans<<'\n';
}
return 0;
}

NC14583 糖糖别胡说,我真的不是签到题目的更多相关文章

  1. 执行update语句mysql5.6报错ERROR 1292 (22007): Truncated incorrect DOUBLE value: '糖糖的坤大叔'

    执行修改语句update tbl_user_details set nickname=CONCAT("用户",yunva_id) where nickname = yunva_id ...

  2. runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance

    情景: 使用MethodSwizzle 实现对数组.字典 等系统方法的安全校验.显然能达到预期效果,但实际发现当 键盘显示的情况下  home app 进入后台,再单击app  图标 切换回前台时 发 ...

  3. Visual Studio 2015 & C#6.0

      Visual Studio 2015 & C#6.0 试用报告,持续更新.   昨天早上看到了.net开源的消息,我是非常兴奋的,毕竟局限于Windows的.NET经常被人唾弃.VB暂且不 ...

  4. Visual Studio 2015 & C#6.0 试用报告,持续更新。

    昨天早上看到了.net开源的消息,我是非常兴奋的,毕竟局限于Windows的.NET经常被人唾弃.VB暂且不提,C#常年被人指责跨平台性不佳,我也是无能为力.即使有Mono等第三方跨平台工程,.NET ...

  5. java8--List转为Map、分组、过滤、求和等操作----代码示例

    Java 8 函数式编程风格 Java 迄今为止最令人激动的特征.这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能.这些特性如此有趣以至于被认为是不合理的.他们说会影 ...

  6. 【JS复习笔记】03 继承(从ES5到ES6)

    前言 很久以前学习<Javascript语言精粹>时,写过一个关于js的系列学习笔记. 最近又跟别人讲什么原型和继承什么的,发现这些记忆有些模糊了,然后回头看自己这篇文章,觉得几年前的学习 ...

  7. js中的类

    概述 经典的老书害人啊,全是讨论怎么解决javascript里面用函数形式定义类的坑.结果es2015直接用class关键字解决了所有问题.虽然class关键字没有什么新东西,只是js现有继承结构的语 ...

  8. 关于IEnumerator<T>泛型枚举器 和 IEnumerable<T>

    在开发中我们经常会用到 IEnumerable<T> xxx 或者 List<T> xxx 这种集合或者集合接口,实际上就是一个线性表嘛然后结合C#提供的语法糖 foreach ...

  9. Python学习 day09

    一.文件的修改 python中修改文件,可以直接通过write实现,但这种方法均比较局限.若有需求:将文件中的某内容替换为新内容,其他内容保持不变.这种需求write理论上是可以实现的,可以将一个文件 ...

随机推荐

  1. python基础练习题(有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?)

    day6 --------------------------------------------------------------- 实例011:养兔子 题目 有一对兔子,从出生后第3个月起每个月 ...

  2. 开源框架YiShaAdmin如何使用任务计划

    1.在Startup添加 new JobCenter().Start();(红色字体,下同) // This method gets called by the runtime. Use this m ...

  3. 了解磁盘IO的那些事

    了解磁盘IO的那些事 我们作为一名开发,经常耳熟能详的一句话,就是提高程序的性能.对于一个应用程序存在问题的直观体现:页面打开很慢,需要等待.造成这样的问题的主要原因有以下几种:1.网络问题.带宽和网 ...

  4. python学习Day21

    目录 今日内容详细 作业讲解 os模块 知识点进修 创建目录(文件夹) 删除目录(文件夹) 查看某个路径下所有的文件名称(文件.文件夹) 删除文件.重命名文件 获取当前路径.切换路径 软件开发目录规范 ...

  5. [AcWing 823] 排列

    点击查看代码 #include<iostream> using namespace std; const int N = 10; int n; void dfs(int u, int nu ...

  6. 3D离线地图开发

    3D离线地图介绍(3D离线采用矢量数据作为地图基础,可保持地图数据最新) 一.开发中引用3D离线地图(可独立部署通过内外IP+端口进行访问,也可拷贝js库文件到项目中通过绝对路径访问) 1).离线AP ...

  7. JQ的is()

     is():根据选择器.元素或jQuery对象来检测匹配元素集合, 如果这些元素中至少有一个元素匹配给定的参数,则返回true. <!DOCTYPE html> <html lang ...

  8. 1903021121-刘明伟 实验一 19信计JAVA—Markdown排版学习

    项目 内容 班级博客链接 19信计班(本) 作业要求链接 实验一 课程学习目标 学习使用Markdown排版 这个作业帮助我们实现了什么学习目标 学会使用Markdown排版 任务一:在博客园平台注册 ...

  9. 好客租房29-从jsx中抽离事件处理程序

    从jsx中抽离过多js逻辑代码 会显得非常混乱 推荐:将逻辑抽离到单独的方法中 保证jsx结构清晰 //导入react     import React from 'react'           ...

  10. CMake进行C/C++开发(linux下)

    开发环境配置 安装GCC,GDB sudo apt update # 通过以下命令安装编译器和调试器 sudo apt install build-essential gdb 安装成功确认 # 以下命 ...