首页 > 其他分享 >CF1914 D Array Collapse 题解

CF1914 D Array Collapse 题解

时间:2023-12-21 15:24:39浏览次数:43  
标签:ch 定义 int 题解 ret CF1914 Array getchar Collapse

Link

CF1914 D Array Collapse

Question

初始给出一个数组 \(\{P\}\) ,数组中每个值都不相同,我们可以选中 \(P\) 数组中连续的一段,然后删除除了最小值以外的所有元素,求删除多次(包括 \(0\) 次)后,剩下的数组的数量

Solution

当时就没怎么往 DP 方面想,没想到还能这样 DP

定义 \(F[i]\) 表示以 \(i\) 为结尾的数量,但是注意如果枚举到 \(j>i\) ,\(F[i]\) 很可能没定义

具体地,如果枚举到一个 \(j>i\) 有 \(a[j]<a[i]\) 那么在枚举到 \(j\) 时 \(F[i]\) 也就没有定义了,因为不可能以 \(a[i]\) 结尾

考虑到不可能以 \(a[i]\) 结尾,但是我们能替换 \(a[i]\) 和 \(a[j]\) 的值来帮我们转移方程

具体地,如果 \(a[i]>a[j]\) ,且 \(i<k<j\) 的每个 \(a[k]>a[j]\) 那么我们就可以用一次删除 \([i,j]\) 的操作,把最后一个字母从 \(a[i]\) 替换成 \(a[j]\)

所以对于每一个 \(j\) ,我们都可以找到左边第一个小于 \(a[j]\) 的 \(a[i]\) ,有三种选择

  • 加在后面
  • 要么替换 \((i,j)\) 中的最后一个字母,也就是加上 \(\sum\limits_{k=i+1}^{j-1} F[k]\)
  • 删除 \([i+1,j)\) 就相当于加上 \(i\) 之前的,有定义的 \(F[i]\) 的值

这种定义和转移还是第一次见,方程刷到后面会发现前面的有些 \(F[i]\) 没有定义

具体实现利用单调栈,维护左边第一个比他小的数

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int TT=998244353;
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}

void solve(){
    int n=read();
    vector<int> a(n+1,0),F(n+1,0),sum(n+1,0);
    stack<int> st;
    for(int i=1;i<=n;i++) a[i]=read();
    int ans=0;
    for(int i=1;i<=n;i++){
        while(!st.empty()&&a[i]<a[st.top()]) ans=(ans-F[st.top()])%TT,st.pop();
        if(st.empty()) F[i]=(sum[i-1]+1)%TT;
        else F[i]=(sum[i-1]-sum[st.top()]+ans)%TT;
        sum[i]=(sum[i-1]+F[i])%TT;
        ans=(ans+F[i])%TT;
        st.push(i);
    }
    printf("%lld\n",(ans+TT)%TT);
}

signed main(){
    freopen("D.in","r",stdin);
    int T=read();
    while(T--) solve();
    return 0;
}

标签:ch,定义,int,题解,ret,CF1914,Array,getchar,Collapse
From: https://www.cnblogs.com/martian148/p/17919121.html

相关文章

  • P9973 [THUPC 2024 初赛] 你说得对,但是 AIGC の 题解
    难度极低。显然,句子开头是Youareright,but即为人工智能。#include<iostream>#include<string>#include<cstdio>namespaceio{template<typenameT>inlinevoidread(T&x){x=0;boolf=false;charch=getchar();while(ch<'0......
  • P4147 玉蟾宫 题解
    P4147玉蟾宫题解题目链接P4147玉蟾宫简要思路很容易发现,这是最大子矩形问题的板子题。定义一个二维的\(dp\)数组,\(dp_{i,j}\)代表以坐标\((i,j)\)为底的线段,最长能向上延伸多少个单位长度的F(如果自身为R,值则为\(0\))。对于\(dp\)数组的维护,分为两种情况:当\(......
  • java,ArrayList类
    ArrayList是一个数组列表,可以将多个对象放入数组中,是一个长度可变的集合,提供了增删改查的功能。publicclassTest2{publicstaticvoidmain(String[]args){Catc1=newCat("小黑","黑色",2.2);Catc2=newCat("小白","白色",2.3);Catc......
  • THUPC 2024 初赛部分题解和游记
    我们队赛时被J题创死了awa离做出来差一个剪枝,而且赛后试了试不加剪枝甚至能过……6题离场。一些题解J套娃先对\([0,n]\)中每个数\(k\)分别考虑。假设总共出现了\(c\)次\(k\),第\(i\)次出现的位置是\(pos_{i}\),(令\(pos_0=0,pos_{c+1}=n+1\)),则只有处在\(pos_{......
  • 软件测试/测试开发|selenium NoSuchDriverException问题解决
    前言我们在使用selenium进行web自动化测试时,有时候会遇到NoSuchDriverException的问题,这个异常通常是由于WebDriver无法找到指定的浏览器驱动而引起的。在这篇文章中,我们将讨论NoSuchDriverException的原因以及如何解决这个问题。NoSuchDriverException是什么?NoSuchDriverException......
  • 华中师范大学2023新生赛 I 镜面折跃 题解
    Link华中师范大学2023新生赛I镜面折跃Question懒得转述了Solution确实是一道好题可以把一节方格拆成\(4\)个点,每个点分别代表从四个方向射进这个节点的光线如果没有镜子,那么就左侧节点的右侧连接自己的右侧,以此类推如果有镜子,那么顺着镜子方向建边,边权为\(0\),向\(9......
  • 题解 Gym 102341B【Bulbasaur】/ SS231107C【爬梯高手】
    题解SS231107C【爬梯高手】撞原了,好耶!Gym102341B顺便把我的变异加强版爆标了!!!problem有一个\(n*m\)个点的有向分层图,共有\(n\)层,每层\(m\)个点,每条边一定是从第\(i\)层连向第\(i+1\)层。定义\(f(i,j)\)表示选择若干条路径,每条路径从第\(i\)层出发,在第\(j\)......
  • U388010 题解
    洛谷U388010题解link:https://www.luogu.com.cn/problem/U388010Sol首先,我们看到这一条件:对于每一个\(1\lei\len\),\(1\lej\len\),\(i\neqj\)满足\(a_i\bmoda_j\neq0,\a_j\bmoda_i\neq0\)。我们知道,质数的因数只有\(1\)和本身,所以当序列里全是质数......
  • 下载图片中文乱码问题解决记录
    1.问题背景需求需要做一个场所码下载的需求,后端接口实现使用的是AWT[1]。在本地Windows开发环境联调接口一切正常,当部署到测试环境Linux服务器上之后,前端同事反馈下载的图片如下:这个问题其实不能算是乱码,而是字体缺失,图片中的汉字使用了微软雅黑字体,而测试环境使用的是docker部......
  • CF1914 G Light Bulbs 题解
    LinkCF1914GLightBulbsQuestion有\(2n\)盏灯摆放在一条直线上,每盏灯有一个颜色\(a_i\),灯的颜色一共有\(n\)种,每个颜色的颜色的灯刚好两盏,灯开始都是熄灭的。你选择几盏灯先打开,然后通过以下规则让其他的灯打开选择\(i,j\)是相同颜色的,一盏亮,一盏不亮,你可以使两盏......