NUIST OJ 1352 回顾 【差分】
NUIST OJ 1352 回顾 【差分】
- NUIST OJ 1352 回顾 差分
- 题目
- 原问题
- 差分是什么
- 求An数组和Sn数组
- 快速求区间和
- 代码呈现
- 随便说说
- 后记
题目
题目描述
第三次选择那些大晴天的日子,第三次行走在孤单的海岸线,第三次静静地种更多的花给自己看~
我们假设把海岸线分为n块,每块的分别标记为1…n,每块都可以种花,每次种花可以选择某个[left,right]的闭区间,每块种上一朵花.经过m次种花操作后, 输入t次区间, 根据输入的区间,求该区间内花的总数.
注意这一次,我们要看更多次的花儿,所以在第一行要输入看花的次数t
输入描述:
多组输入
对每组输入,第一行有三个整数n m t,分别代表总块数和种花的次数以及我们希望查询区间的次数.
(1 <= n, m, t<= 100000)
接下来的m行, 每行两个整数 L,R 代表[L,R]区间内每块种上一朵花.(1 <= L <= R <= n)
接下来的t行, 每行输入两个整数 a,b 代表最后要查询的花的总数的区间.(1 <= a <= b <= n)
原问题:
原问题详见
NUIST OJ 1350-1352 面朝大海,春暖花开【初识线段树】
差分是什么
所谓差分,以大家高中学到的数列概念来理解。
假设
n | 1 | 2 | 3 | …… | n |
---|---|---|---|---|---|
Dn | 0 | 1 | 3 | …… | i |
An | 1 | 2 | 5 | …… | An-1 +i |
Sn | 1 | 3 | 8 | …… | Sn-1 + An |
类似于这样的差值数列。
那么在本题中,在[a,b]区间上种花,实际上带来的结果就是,a比a-1的值多1,即Dn(n=a)加了1。这样,从a区间开始往后的每一个区间,因为An(n=a)的值加了1,而他们和前一项的差值Dn(n>a)没有改变,所以实际上他们的An(n>a)都比原来大了1。而到B结束则可以将Dn(n=b+1)的值减1,这样从b+1开始,后面的值都不会受到此次操作的影响了。这样,仅仅通过对两个Dn的改变,实际上修改了整整一串的值。大大减少了时间消耗。
求An数组和Sn数组
只需要利用公式,An=An-1+Dn即可计算出An;Sn=Sn-1+An即可计算出Sn
实际上就是对数组进行了两次循环加和的操作
快速求区间和
有了Sn数组,求区间和的操作就快很多了,不需要将区间内的An一个个加起来;
At~Al的和可以用Sl-St-1求得
代码呈现
#include<cstdio>
#include<cstring>
using namespace std;
int dat[100010];
int main()
{int n, m, t, l, f, a, b;while (scanf_s("%d %d %d",&n,&m,&t)!=EOF) {memset(dat, 0, (n + 1)*sizeof(int));for (int i = 0; i<m; i++) {scanf("%d %d",&l,&f);dat[l] += 1;dat[f + 1] -= 1;}for (int i = 1; i <= n; i++)dat[i] += dat[i - 1];for (int i = 1; i <= n; i++)dat[i] += dat[i - 1];for (int i = 0; i<t; i++) {scanf("%d %d", &a, &b);printf("%d\n", dat[b] - dat[a - 1]);}}return 0;
}
随便说说
差分在处理区段求和上有非凡的表现。虽然曾经我们都学过数列,但是真正用起来的时候却完全想不到它。渍渍渍,遗憾呐。
另外,差分在这里有一个小缺陷。必须所有数据全部录入完毕之后,根据完整的Dn表格生成An表格,再根据An的表格生成Sn的表格。若是生成完毕之后其中有一处需要修改,那么需要重新生成Dn和Sn,这样就失去了它的独特优势。
后记
照例膜拜ThinkSpirit各位大佬
第一个想到这个方法的大佬解说如下
THINKSPIRIT ALGORITHM TEAM TASK #1 解题报告
NUIST OJ 1352 回顾 【差分】相关推荐
- NUIST OJ 1350-1352 面朝大海,春暖花开【初识线段树】
NUIST OJ 1350-1352 面朝大海,春暖花开 NUIST OJ 1350-1352 面朝大海春暖花开 NUIST OJ 1350 面朝大海 春暖花开 基础版 NUIST OJ 1351 面 ...
- NUIST OJ 1364 [2017 江苏科技大学 程序设计竞赛]D.重复成绩统计(改编) 【STL-map】
NUIST OJ 1364 [2017 江苏科技大学 程序设计竞赛]D.重复成绩统计(改编) [STL-map] NUIST OJ 1364 2017 江苏科技大学 程序设计竞赛D重复成绩统计改编 S ...
- NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版)
NUIST OJ 1369 [2017 江苏科技大学 程序设计竞赛] B. Mr.Z 的四因子数 (数据加强版) NUIST OJ 1369 2017 江苏科技大学 程序设计竞赛 B MrZ 的四因子 ...
- NUIST OJ 1347 供电站 [迭代加深搜索]
题目 题目分析 本题的坑 整体代码与运行结果 题目 题目描述 你一个程序员,不知为何就当上了你们镇的镇长(人的一生当然要靠自我奋斗,当然也要考虑历史的进程).你们镇有 N (3 <= N < ...
- 并查集——NUIST OJ P1648 炼丹术为例
并查集 定义:并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题 主要构成: 并查集主要由一个整型数组pre[]和两个函数find().join()构成. 数组pre[]记录了每个点的 ...
- 差分隐私 机器学习_满足差分隐私的经验误差最小化方法
手上的东西有点进行不下去,滚过来写专栏作下回顾.上次聊了聊差分隐私的定义,那么现在我们要在差分隐私的框架上实现机器学习任务. 关于差分隐私机器学习这个方向,Kamalika Chaudhuri 在ni ...
- 【Rényi差分隐私和零集中差分隐私(差分隐私变体)代码实现】差分隐私代码实现系列(九)
差分隐私代码实现系列(九) 写在前面的话 回顾 差分隐私的变体 发明变体的动机 最大散度和Rényi散度 Rényi差分隐私 零集中差分隐私 差分隐私变体的组合情况 总结 写在前面的话 书上学来终觉浅 ...
- 【差分隐私组合定理,直方图,列联表代码实现】差分隐私代码实现系列(五)
差分隐私代码实现系列(五) 写在前面的话 回顾 差分隐私的属性(Properties of Differential Privacy) 顺序组成(Sequential composition) 平行组 ...
- 【拉普拉斯机制代码实现demo】差分隐私代码实现系列(四)
差分隐私代码实现系列(四) 写在前面的话 回顾 差分隐私(Differential Privacy) 拉普拉斯机制(The Laplace Mechanism) 多少噪音就足够了?(How Much ...
最新文章
- 【MySQL】 性能优化之 延迟关联
- C# 集合交、并、差、去重,对象集合交并差
- python把一堆图片分成n份,用Python一键生成炫酷九宫格图片,火了朋友圈
- 控制台文字对战游戏 初始版
- 项目疑难杂症记录(三):EditText获取不到焦点了?
- Python-爬虫-针对有frame框架的页面
- html点线面制作,利用HTML5绘制点线面组成的3D图形的示例_html5教程技巧
- chmod命令-权限
- Oracle服务的作用
- 关于@Autowired的使用:推荐使用构造函数进行注入
- codeproject的文章【一】
- 基于视频会议系统的应急指挥项目建设方案
- 7-77 打印学生选课清单 (25分)
- Redis的数据变成backup
- 三体 读后思考-泰勒展开/维度打击/黑暗森林
- Appium 关于 swipe 滑动时间控件选择时间问题,swipe 滑动没效果,用 TouchAction代替
- 开网店必看:母婴类目怎么做?
- 微信公众平台版面设计需要服务器,微信公众平台丨排版的基本原则
- 学习Three.js——后期处理(EffectComposer)
- 重磅发布《2020年中国乳制品行业数据中台研究报告》
热门文章
- 煤化工专用阀门有哪些?
- 当好色女子遇上好色之徒-案例
- [编译环境]Anaconda navigator怎么打不开了?
- Datatable 插件出现DataTable is not a function 错误
- Leetcode TOP Questions
- 被误解的C++——法国大革命
- 周末接受了 @36氪 网站的专访
- TOLT(you only look twice): Rapid multi-scale object detection in satellite imagery(中文翻译simrdwn)
- NLP 利器 Gensim 来训练 word2vec 词向量模型的参数设置
- Mapbox GL JS介绍及使用