本文转载自我在洛谷P10903题解

前置知识:前缀和与差分

前缀和

简单而言,给定数组 $a_1,a_2,a_3,\cdots,a_n$,现在想要快速求出 $a_l,a_{l+1},a_{l+2},\cdots,a_r$ 的和。

  • 朴素算法遍历 $a_l$ 至 $a_r$,时间复杂度 $\mathcal O(r-l+1)$。
  • 使用前缀和算法,时间复杂度 $\mathcal O(1)$。
  • 记数组 $b_1,b_2,b_3,\cdots,b_n$ 使得 $b_i=b_{i-1}+a_i$,即 $b_i=a_i+a_2+a_3+\cdots+a_i$。

这样 $b_r-b_{l-1}$ 即为区间和。

更多相关内容见此

差分

简单而言,给定数组 $a_1,a_2,a_3,\cdots,a_n$,现在想要快速使得 $a_l,a_{l+1},a_{l+2},\cdots,a_r$ 的值增加 $x$。

  • 朴素算法遍历 $a_l$ 至 $a_r$,时间复杂度 $\mathcal O(r-l+1)$。(这不一样的吗??)
  • 使用差分算法,时间复杂度 $\mathcal O(1)$。
  • 记数组 $b_1,b_2,b_3,\cdots,b_n$ 使得 $b_i=a_i-a_{i-1}$。

这样修改 $b_l$ 为 $b_l+x$,$b_{r+1}$ 为 $b_{r+1}-x$ 即可。

因为 $a_l$ 至 $a_r$ 全部增加 $x$,相邻差值不变,而 $a_l$ 与 $a_{l-1}$ 的差值就增加了 $x$;倘若不更改 $b_{r+1}$ 减去 $x$,那么还原时 $a_{r+1}$ 至 $a_n$ 全体都会增加 $x$,因此 $b_{r+1}$ 要减去 $x$。

更多相关内容见此

处理策略

1.朴素算法

输入完成后枚举 $1$ 至 $m$ 哪个操作不做,暴力增加 $1$,最后统计 $0$ 的个数。

时间复杂度:$\mathcal O(m(mn+n))$。

显然超时

2.差分算法

输入完成后枚举 $1$ 至 $m$ 哪个操作不做,每次都差分维护区间 $[l,r]$ 增加,最后还原时统计 $0$ 的数量即可。

时间复杂度:$\mathcal O(m(m+n))$。

考虑到数据范围 $1 \le n,m \le 3 \times 10^5$,仍会超时

得分:$20 \text{pts}$。

部分代码:

const int N=3e5;
struct node{
int l,r;
}a[N+1];//其实不用结构体也行
int n,m,cnt,cf[N+2];//差分数组
int main(){
/*freopen("test.in","r",stdin);
freopen("test.out","w",stdout);*/ scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d %d",&a[i].l,&a[i].r);
for(int i=1;i<=m;i++){
fill(cf+1,cf+n+1,0);//初始化
cnt=0;
//差分维护
for(int j=1;j<=m;j++){
if(j==i)continue;
cf[a[j].l]++,cf[a[j].r+1]--;
}//差分还原:统计0的数量
for(int j=1;j<=n;j++){
cf[j]+=cf[j-1];
if(cf[j]==0)cnt++;
}printf("%d\n",cnt);
} /*fclose(stdin);
fclose(stdout);*/
return 0;
}

3.前缀和+差分优化

输入 $n$,$m$ 后输入 $l_i$,$r_i$,输入的时候便直接使用差分维护增加 $1$。

维护完成后还原,还原时统计 $0$ 的个数 $cnt0$。这时,只需要加上 $[l_i,r_i]$ 内不执行操作 $i$ 产生的 $0$ 的数量 $pl$ 即可

显然对于区间 $[l_i,r_i]$,最坏查找可以达到 $\mathcal O(n)$,那么时间复杂度便达到了 $\mathcal O(mn)$。

考虑到 $mn$ 最大为 $(3 \times 10^5) \times (3 \times 10^5) = 6 \times 10^{10}$,显然又双叒叕具有超时的风险。(这个超时代码就不贴了)

如果我们使用一个 $cnt1_i$ 记录 $i$ 号位置是否为 $1$,那么显然答案 $pl=\sum\limits_{j=l_i}^{r_i}cnt1_j$。

仔细看看,不难发现,这就是快速求 $cnt1_{l_i}$ 至 $cnt1_{r_i}$ 的和。那么我们更改 $cnt1$ 的定义,使 $cnt1_i$ 为 $1$ 至 $i$ 号位里 $1$ 的总数,则 $pl=cnt1_{r_i}-cnt1_{l_{i-1}}$。

则最终答案为 $cnt0+cnt1_{r_i}-cnt1_{l_{i-1}}$。

时间复杂度:$\mathcal O(n+m)$。

AC代码

//#include<bits/stdc++.h>
#include<algorithm>//个人习惯,忽略即可
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
using namespace std;
const int N=3e5;
int n,m,l[N+1],r[N+1],cnt0,cf[N+2],cnt1[N+1];
int main(){
/*freopen("test.in","r",stdin);
freopen("test.out","w",stdout);*/ scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d",l+i,r+i);
cf[l[i]]++,cf[r[i]+1]--;//差分维护
}
for(int i=1;i<=n;i++){
cf[i]+=cf[i-1];//差分还原
cnt1[i]=cnt1[i-1];//cnt1前缀和
if(cf[i]==0)cnt0++;//统计0的数量
if(cf[i]==1)cnt1[i]++;//前缀和统计1~i里1的数量
} //输出,含义如上文所述
for(int i=1;i<=m;i++){
printf("%d\n",cnt0+(cnt1[r[i]]-cnt1[l[i]-1]));
} /*fclose(stdin);
fclose(stdout);*/
return 0;
}

题解:[蓝桥杯 2024 省 C] 商品库存管理的更多相关文章

  1. 第六届蓝桥杯软件类省赛题解C++/Java

    第六届蓝桥杯软件类省赛题解C++/Java 1[C++].统计不含4的数字统计10000至99999中,不包含4的数值个数.答:暴力循环范围内所有数字判断一下就是了,答案是52488 1[Java]. ...

  2. 第十届蓝桥杯省赛JavaB组个人题解

    前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...

  3. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

  4. [18/12/3]蓝桥杯 练习系统 入门级别 Fibonacci数列求模问题 题解思路

    前言略. 看到这个题目本来应该很高兴的,因为什么,因为太TM的基础了啊! 可是当你用常规方法尝试提交OJ时你会发现..hhh...运行超时..(开心地摇起了呆毛 //Fibonacci数列递归一般问题 ...

  5. 2018年蓝桥杯A组C/C++决赛题解

    2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...

  6. 2016年蓝桥杯B组C/C++决赛题解

    2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...

  7. 2015年蓝桥杯B组C/C++决赛题解

    2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案)     1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...

  8. 2018年蓝桥杯B组C/C++决赛题解

    2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...

  9. 2018年第九届蓝桥杯B组第四题:摔手机题解

    摔手机 摔手机 动态规划  在蓝桥杯的时候遇到一次 当时没有做对  看了题解也没明白  如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...

  10. 第九届蓝桥杯省赛c/c++真题明码题解答案,另类excel解法思路

    直到快比赛才重视起之前学校给报了蓝桥杯,且这段时间一直在做Python,所以没做什么准备. 赛场上做这道题时连反码补码的知识点都记混,所以直接用了excel做这道题目,分享下做题思路.及题解. 标题: ...

随机推荐

  1. Spring基于注解的事务管理

    Spring基于注解的事务管理 源码 代码测试 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...

  2. 工具 | StarCodeSecurity

    0x00 简介 StarCodeSecurity是一款图形化的代码审计工具. 下载地址: StarCodeSecurity下载:StarCodeSecurity下载 0x01 功能说明 支持对规则进行 ...

  3. js技术之“自定义包含方案”

    调用 // 用于判断包含 function diaoyong(arr, str){ // 初始化 var sizes = ['L','XL','S','M']; for (var i = 0; i & ...

  4. 鸿蒙Next复杂列表性能优化:让滑动体验如丝般顺滑

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  5. CentOS7.6安装RabbitMQ

    1.CentOS7.6安装RabbitMQ yum install -y socat yum install -y erlang 2.安装rabbitmq yum install rabbitmq-s ...

  6. IDEA主题下载仓库地址

    拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme

  7. AI对低代码技术的影响

    一.开发效率革命的"双引擎" 在过去的数十年里,软件工程领域正在经历一场由低代码平台和人工智能技术共同驱动的效率革命.这两股技术浪潮虽源于不同的技术路径,却共同指向同一个战略目标: ...

  8. Mac 终端下svn常用命令的使用

    svn基本的操作流程 刚刚进入一个新的公司,让我接手一个正在进行的项目,我打开终端写下了:svn co svn://192.168.1.1/pro/domain 然后就可以在当前目录里面找到一个叫do ...

  9. Mysql数据类型TINYINT(1)与布尔型的坑

       需求背景:从MySQL数据库读取1.2.3.4等阿拉伯数字定义的状态,并转换成Java中Integer类型的数据,但是转换失败了.    问题分析:布尔型 bool 或者 boolean 在My ...

  10. FactoryBean 和BeanFactory的傻傻的总是分不清?

    引言 记得很久以前经常被问到这样一个面试题"FactoryBean 和BeanFactory它们有啥区别".在 Spring 框架中,BeanFactory 和 FactoryBe ...