首页 > 其他分享 >[DP 倍增]区间的连续段

[DP 倍增]区间的连续段

时间:2022-11-25 20:36:59浏览次数:54  
标签:pre int scanf 位置 区间 倍增 DP lld


[DP 倍增]区间的连续段

题目

​题目链接​

[DP 倍增]区间的连续段_#define

思路

题意:
给你长度为n的数组,由m次查询,每次查询问对于区间[l,r],最少把区间内数切成几段,使得每一段满足和都<=k。

个人学习记录使用,​​参考这里的第一篇题解​

数据范围很大,暴力必T
对于100%的数据,1 <= n , m <= 1000000 , 1 <= ai , k <= 1000000000

然后照着题解学了一下倍增优化

1预处理除前缀和

[DP 倍增]区间的连续段_预处理_02

2然后对倍增DP数组做预处理

[DP 倍增]区间的连续段_i++_03表示从i开始分成[DP 倍增]区间的连续段_i++_04段,能走到最远的位置的下一个位置

[DP 倍增]区间的连续段_i++_05

[DP 倍增]区间的连续段_预处理_06就是第i个位置能走到最远的位置,这个可以用二分upper_bound预处理出满足条件[DP 倍增]区间的连续段_预处理_07最后一个位置的下一个位置,这个可以转化为查找第一个[DP 倍增]区间的连续段_i++_08的位置

3倍增DP状态转移

[DP 倍增]区间的连续段_预处理_09

4查询

反向遍历j

如果从i开始分成[DP 倍增]区间的连续段_i++_04段能到达的最远位置

如果比r大,减小i

如果<=r,增加答案,更新左端点

5检验

[DP 倍增]区间的连续段_预处理_11

如果查询到最后[DP 倍增]区间的连续段_i++_12表示还有答案的,因为要到f[l][0]才会>k啊
如果[DP 倍增]区间的连续段_#define_13表示没有答案,注意这里包含<=,因为定义的是满足条件的下一个位置

代码

// Problem: 区间的连续段
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/problem/15429
// Memory Limit: 524288 MB
// Time Limit: 14000 ms
// FishingRod

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long LL;
typedef pair<int,int> PII;
//#define MULINPUT
/*DATA & KEY
n 1 1e6
m 1 1e6
ai 1 1e9
k 1 1e9
*/
int T;
LL n,m,k;
const int N=1e6+10;
LL a[N],pre[N],f[N][22];
void solve(int C)
{
//NEW DATA CLEAN

//NOTE!!!
scanf("%lld %lld %lld",&n,&m,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
pre[i]=pre[i-1]+a[i];//处理前缀和
}
for(int i=0;i<=21;i++)f[n+1][i]=n+1;//第一个预处理
for(int i=n;i>=1;i--)
{
f[i][0]=upper_bound(pre+i,pre+n+1,pre[i-1]+k)-pre;//第二个预处理
for(int j=1;j<=21;j++)
f[i][j]=f[f[i][j-1]][j-1];
}
while(m--)
{
int l,r,ans=0;
scanf("%d %d",&l,&r);
for(int i=21;i>=0;i--)
{
if(f[l][i]<=r)ans+=1<<i,l=f[l][i];
}
if(f[l][0]>r)printf("%d\n",ans+1);
else printf("Chtholly\n");
}
}

int main()
{
#ifdef MULINPUT
scanf("%d",&T);
for(int i=1;i<=T;i++)solve(i);
#else
solve(1);
#endif
return 0;
}


标签:pre,int,scanf,位置,区间,倍增,DP,lld
From: https://blog.51cto.com/u_15891800/5887726

相关文章

  • [DP/贪心 时间] P1717 钓鱼
    [DP时间]P1717钓鱼​​题目链接​​题目思路贪心可以做的比较简单,不过这里打算练习一下DP写法为了简化计算,把5分钟设为单位时间状态表示表示走到第i个湖钓鱼,耗时j属性:ma......
  • [边数限制最短路 倍增floyd 矩阵优化]Cow Relays G
    [边数限制最短路倍增floyd矩阵优化]CowRelaysG题目思路边数限制的最短路?bellman_ford可以拿来解决边数<=k的最短路,但这题是边数恰好为k,可以通过奇妙操作改成恰好经过k......
  • 【状压DP】哈密顿回路问题
    【状压DP】哈密顿回路问题lzq同学在我准备午睡的时候发了一道蓝桥杯的题目给我,是哈密顿回路的。第一次看的时候是想DFS+双向搜索优化减小搜索树规模,然后写烂了(如果有大佬用......
  • [DP 字符串 计数去重]L3-020 至多删三个字符
    [DP字符串]L3-020至多删三个字符题目思路状态表示集合属性:count(不包含重复)状态计算:删除第i个或者不删除第i个这题比较恶心的地方在于去重aacdbb删掉最后一个b和删除......
  • [DP 形状 线性]P1990 覆盖墙壁
    [DP形状线性]P1990覆盖墙壁​​题目链接​​思路把边界形状作为状态标识,类似杨老师照相序列那题为长度为i,状态为j的方案数目标是:代码//Problem:P1990覆盖墙壁//Con......
  • [DP 01背包/差值DP 存在性]小M和天平
    [DP01背包/差值DP存在性]小M和天平题目室友大佬去玩了蓝桥杯,听室友回寝口述的题目,然后水群的时候群友说和这题差不多就做一下。感觉和不久前做的差值DP有点关系。思路两种......
  • #yyds干货盘点# 动态规划专题:括号区间匹配
    1.简述:描述给定一个由'[',']','(',‘)’组成的字符串,请问最少插入多少个括号就能使这个字符串的所有括号左右配对。例如当前串是"([[])",那么插入一个']'即可满足。数据范围......
  • DOS批处理中%cd%和%~dp0的区别
    %cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径。%cd%,一个是%~dp0。   这两个变量的用法和代表的内容是不同的。  %cd% ......
  • [dp 记录]P3349 [ZJOI2016]小星星
    绝世容斥好题,刚好NOIp前要复习容斥,就拉过来当100紫了。祝自己明天的NOIprp++这题好久前看过题解,感觉好可惜,浪费了好题。以后自己不会的题也不能看题解了。题意:......
  • WordPress编辑器支持Word自动上传
    ​ 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况本文使用的后台是Java。前端为Jsp(前端都一样,后台如果语言不通得自己......