首页 > 其他分享 >D. Program(有点难度的线性DP)

D. Program(有点难度的线性DP)

时间:2023-04-13 11:56:58浏览次数:52  
标签:maxx minn int sufL sufR Program 线性 now DP

题目

D. Program

题意

给一个长度为n的‘+’,‘-’序列,表示+1和-1
在给m个查询,问忽略[l,r]之间的序列,能走到多少个不同的数字

思路

  • 分为前后缀计算,前缀计算比较简单关键是后缀计算
  • 后缀上,需要关注能够到达的最小值和最大值
  • 定义sufL[i]和sufR[i]分别表示为到达的最小值和最大值
  • 可以得出转移方程
    • now = s[i] == '+' ? 1 : -1;
    • sufR[i] = max(sufR[i + 1] + now, 0);
    • sufL[i] = min(sufL[i + 1] + now, 0);

代码

const int N = 2e5+10;
char s[N];
int preL[N], preR[N], pre_cur[N];
int sufL[N], sufR[N];
void solve()
{
    int n, m;
    cin >> n >> m;
    cin >> s + 1;
    preL[0] = preR[0] = pre_cur[0] = 0;
    for (int i = 1; i <= n;i ++)
    {
        pre_cur[i] = pre_cur[i - 1] + (s[i] == '+' ? 1 : -1);
        preL[i] = min(pre_cur[i], preL[i - 1]);
        preR[i] = max(pre_cur[i], preR[i - 1]);
    }

    sufL[n + 1] = sufR[n + 1] = 0;
    for (int i = n; i >= 1;i --)
    {
        int now = s[i] == '+' ? 1 : -1;
        sufR[i] = max(sufR[i + 1] + now, 0);
        sufL[i] = min(sufL[i + 1] + now, 0);
        // debug2(sufL[i], sufR[i]);
    }

    for (int i = 1; i <= m; i++)
    {
        int l, r;
        cin >> l >> r;
        l--;r++;
        int maxx = max(0, preR[l]), minn = min(0, preL[l]);
        maxx = max(maxx, sufR[r] + pre_cur[l]);
        minn = min(minn, sufL[r] + pre_cur[l]);
        // debug2(maxx, minn);
        cout << maxx - minn + 1 << endl;
    }
}

标签:maxx,minn,int,sufL,sufR,Program,线性,now,DP
From: https://www.cnblogs.com/cfddfc/p/17314149.html

相关文章

  • 配电网潮流解的存在性与线性逼近 MATLAB源代码
    配电网潮流解的存在性与线性逼近MATLAB源代码,代码按照高水平文章复现,保证正确讨论了描述平衡配电网的非线性功率方程的显式近似解的推导问题。给出了潮流方程实际解存在的充分条件,并给出了PQ母线有功和无功功率需求的线性近似。对于一般的电力线阻抗和电网拓扑,我们给出了近似......
  • 如何解决更新WordPress需要访问您网页服务器的权限
    今天更新wordpress版本时网站后台提示“要执行请求的操作,WordPress需要访问您网页服务器的权限”,更新插件也提示,更新主题也提示。后来百度查询了一下,找到了解决办法,只需要找到wp-config.php这个文件,在最后面加上如下代码就能解决问题,至于是什么原因造成的并不清楚。define(“FS_......
  • 线性筛,整除分块,欧拉函数与莫比乌斯反演
    埃氏筛法说到筛质数,就不得不提到大名鼎鼎的埃氏筛法了思想非常简单,就是对于每一个素数pri[i],我们都把它的倍数筛去,譬如对于素数2来说,我们就把\(2*2,2*3,2*4,2*5....2*n\)的数全部筛掉代码voidzhishu(intn){ for(inti=2;i<=n;i++){ if(p[i]==0) for(intj=i*2;......
  • 7663: 股票买卖 动态规划/线性dp
    描述 最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。假设阿福已经准确预测出了某只股票在未来N天的价格,他希望买卖两次,使得获得的利润最高。为了计算简单起见,利润的计算方式为卖出的价格减去买入的......
  • dpt-shell 抽取壳实现原理分析(执行逻辑)
    开源项目位置(为大佬开源精神点赞)https://github.com/luoyesiqiu/dpt-shell抽取壳分为两个步骤加壳逻辑:一对apk进行解析,将codeItem抽出到一个文件中,并进行nop填充二对抽取后的apk进行加密三注入壳程序相关文件即配置信息执行逻辑:一壳程序执行二壳解密......
  • dpt-shell 抽取壳实现原理分析(加壳逻辑)
    开源项目位置(为大佬开源精神点赞)https://github.com/luoyesiqiu/dpt-shell抽取壳分为两个步骤加壳逻辑:一对apk进行解析,将codeItem抽出到一个文件中,并进行nop填充二对抽取后的apk进行加密三注入壳程序相关文件即配置信息执行逻辑:一壳程序执行二壳解密......
  • 给技术新人的ODPS优化建议
    数据开发基本都是从陌生到熟悉,但是写多了就会发现各种好用的工具/函数,也会发现各种坑,本文分享了作者从拿到数据到数据开发到数据监控的一些实操经验。写在前面本文档是组内的一份算法ODPS离线开发分享,仅列出了这些年积累下来的一些重要经验和结论,特别是在算法日常数据处......
  • SPRING ThreadPoolTaskExecutor示例
    0、前言当我们需要实现并发、异步等操作时,通常都会使用到ThreadPoolTaskExecutor。它是springcore包中的,而ThreadPoolExecutor是JDK中的JUC。ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。1、示例1.1、配置类importorg.springframework.context.annotation......
  • 3线性部分:古典解-Schauder理论(严格椭圆算子的Schauder估计)
    严格椭圆算子的Schauder内估计目录严格椭圆算子的Schauder内估计1.齐次方程的内估计2.Schauder内估计2.1:预备知识2.2:Schauder内估计2.3:推论1.齐次方程的内估计本节我们研究一般线性算子的内估计:\[\begin{equation*} Lu=a^{ij}(x)D_{ij}u+b^i(x)D_iu+c(x)u=f(x),a^{ij}=a^......
  • UVa 103 Stacking Boxes (DP&DAG)
    103-StackingBoxesTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=39BackgroundSomeconceptsinMathematicsandComputerSciencearesimpleinoneortw......