题目链接:点击查看

题目大意:给出 m 个区间,现在可以选择两段长度为 k 的区间进行覆盖,记为 a 和 b,对于每个区间来说,假设被 a 覆盖的长度为 len_a,被 b 覆盖的长度为 len_b,假设 len_a > len_b,那么其将会被 a 覆盖,且提供 len_a 的贡献,反之被 b 覆盖且提供 len_b 的贡献,问如何选择 a 和 b 可以使得总贡献最大

题目分析:比较显然的一个 n^3 的暴力就是:O( n ) 枚举 a,O( n ) 枚举 b,最后 O( n ) 枚举每个区间计算贡献

考虑优化,假设我们已经枚举好了 a,记为 [ L , R ],再计算每个区间与其交集,len[ i ] 表示的是第 i 个区间与 [ L , R ] 的交集,不过此时我们默认的是所有 len[ i ] > 0 的区间都是被 a 覆盖的,所以我们考虑差分维护一下贡献,我们最后的目标是为了得到一个数组 len_b,len_b[ i ] 代表的是,如果 b 的左端点或右端点选择到了点 i 时,不与 a 的覆盖所冲突的最大贡献,这句话可以这样理解:依然假设 len_a 和 len_b 是与某段区间交集的长度,显然 len_a 就是刚刚求出的 len[ i ] 了:

  1. 如果 len_a >= len_b:那么此时该区间选择被 a 覆盖是更优的,所以 b 不做贡献
  2. 如果 len_a < len_b:那么此时被区间 b 覆盖是更优的,且被 b 覆盖后,贡献增加了 len_b - len_a

所以我们的目标就是维护出 len_b[ i ] 这个数组即可

画两张图应该就可以包含所有情况了

我们这里的 len_b[ i ] 代表的是,b 的右端点取到点 i 时的 贡献差

不难看出上述两个图中,当点 i 取到绿色区域时,随着 i 右移,贡献会不断加一,当点 i 取到黄色区域时,贡献会不变,当点 i 取到蓝色区域时,会随着 i 右移贡献不断减一,这个自己想一下应该就能想过来了

所以对 len_b[ i ] 初始时维护一个二阶差分,然后两次前缀和复原即可,上面的几个关键位置都特地写出来了,直接实现即可

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e3+100;int l[N],r[N],delta[N<<1];int cal(int l1,int r1,int l2,int r2)//计算交集长度
{return max(0,min(r1,r2)-max(l1,l2)+1);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++)scanf("%d%d",l+i,r+i);int ans=0;for(int i=1;i+k-1<=n;i++){int L=i,R=i+k-1;int res=0;memset(delta,0,sizeof(delta));for(int i=1;i<=m;i++){int len=cal(l[i],r[i],L,R);res+=len;delta[l[i]+len]++;delta[min(r[i]+1,l[i]+k)]--;delta[max(r[i]+1,l[i]+k)]--;delta[r[i]+k-len+1]++;}for(int i=1;i<=n;i++)//还原二阶差分 delta[i]+=delta[i-1];for(int i=1;i<=n;i++)//还原一阶差分 delta[i]+=delta[i-1];for(int i=1;i<=n;i++)ans=max(ans,delta[i]+res);}printf("%d\n",ans);return 0;
}

CodeForces - 1452E Two Editorials(二阶差分)相关推荐

  1. 牛客多校8 - Enigmatic Partition(二阶差分)

    题目链接:点击查看 题目大意:首先定义 " n 的拆分 " 是 n = a[ 1 ] + a[ 2 ] + ... + a[ m ] ,在本题中,n 的拆分需要满足几个条件: a[ ...

  2. 二阶差分预测后数据还原公式_携程如何基于ARIMA时序分析做业务量的预测

    一. 前言 时间序列分析是统计学科的一个重要分支.它主要是通过研究随着时间的推移事物发展变化过程中的规律,来进行事物未来发展情况的预测.在我们的日常生活中,股票的价格走势,奶茶店每天的销售额,一年的降 ...

  3. 信号识别-波峰波谷二阶差分识别算法

    信号识别-波峰波谷二阶差分识别算法 前言 波峰波谷算法 实际上代码 前言 在图像分析里,投影曲线是我们经常要用到的一个图像特征,通过投影曲线我们可以看到在某一个方向上,图像灰度变化的规律,这在图像分割 ...

  4. ARIMA一阶差分和二阶差分还原

    文章目录 一.思路: 1.差分 2.还原 2.1 一阶差分还原 2.2 二阶差分还原 二.python实现 一.思路: 1.差分 原始序列:a1,a2,a3,a4,a5,a6,a7a_1,a_2,a_ ...

  5. pandas对dataframe数据列进行一阶差分(diff):数据列进行差分(period=1)、数据列进行差分(period=2)、(注意差分的差分才是二阶差分,间隔为2依旧是一阶差分)

    pandas对dataframe数据列进行一阶差分(diff):数据列进行差分(period=1).数据列进行差分(period=2).(注意差分的差分才是二阶差分,间隔为2依旧是一阶差分) 目录

  6. python 提取MFCC特征、一阶差分及二阶差分

    依赖库: python-speech-features-0.6 import python_speech_features import numpy as np import scipy.io.wav ...

  7. 一阶差分与二阶差分及还原

    一阶差分与二阶差分及还原 一阶差分 arr = np.arange(10) np.random.shuffle(arr) arr = pd.Series(arr) arr d1 = arr.diff( ...

  8. 二阶差分(注意数据范围)

    题目描述 小明在练习绝世武功, n 个练功桩排成一排,一开始每个桩的损伤为 0. 接下来小明会练习 m 种绝世武功,每种武功都会对 [l, r] 区间分别造成 [s, e] 的伤害. 这个伤害是一个等 ...

  9. CodeForces - 1491C Pekora and Trampoline(差分+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列 aaa,aia_iai​ 表示第 iii 个蹦床的强度,当从第 iii 个蹦床起跳的话可以跳到 i+aii+a_ii+ai​ 的位置,但是 ...

最新文章

  1. MOS管体二极管的作用
  2. POJ 3686 The Windy's
  3. [置顶] 自己动手实现OpenGL-OpenGL原来如此简单(二)
  4. linux iptables导致httpd网页打不开
  5. IDEA中Project 和 Module的区别
  6. a股历史30年的大盘价_[最新]回顾A股历史上的大井喷行情
  7. 第九届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
  8. 运维老哥必须知道的Linux系统文件目录组织结构
  9. 我觉得吧,这么学JavaScript,你才能通
  10. WinAPI: waveInGetPosition - 获取当前输入设备的输入位置
  11. 买苹果---动态规划
  12. python诞生日期_Python中的时间与日期
  13. HTML页面中返回顶部的几种实现方式
  14. 吴恩达机器学习视频教程(含课程作业源代码和学习笔记)
  15. 让惊艳无处不在 Win7桌面便签操作技巧
  16. idea上传新项目至svn仓库
  17. 太网交换机芯片-KSZ系列
  18. JS实现div随鼠标移动练习
  19. 中国智慧园区标准化白皮书 附下载
  20. 3个动作精准引流方法,放大操作,每天吸粉200+

热门文章

  1. MATLAB代写要求应该怎么写,matlab/simulink程序代写
  2. 用例图(use case)
  3. MySQL分组查询—添加分组后筛选
  4. Nginx的rewrite内容介绍
  5. setHeadAndPropagate
  6. MyBatis 缓存详解-什么时候开启二级缓存?
  7. 加速数据读取的利器-缓存及分布式存储
  8. 商品评价 - 实现分页
  9. 多继承-注意父类之间注意不要有重名方法或属性
  10. 新版本springboot-整合mybatis