2024杭电多校7——1007创作乐曲

news2024/9/27 5:53:25

补题链接

也是好久没补题了,欠了好多好多,我的评价是加训

题目如下:
在这里插入图片描述
官方题解:
在这里插入图片描述
官方题解一如既往的简洁, 对于不会做的人要读懂真的挺难 \sout{对于不会做的人要读懂真的挺难} 对于不会做的人要读懂真的挺难

首先询问最少删除多少音符(一般人来说不太好处理),我们可以考虑它的对立面,最多保留多少字符这是比较好处理的
我们可以尝试着想出 d p dp dp的方程就是
d p i , 0 = m a x { d p i − 1 , 0 , d p i − 1 , 1 } dp_{i,0} = max\{dp_{i-1,0},dp_{i-1,1}\} dpi,0=max{dpi1,0,dpi1,1}
d p i , 1 = m a x { d p j , 1 : ∣ a i − a j ∣ ≤ k } + 1 dp_{i,1} = max\{dp_{j,1}:|a_i-a_j|\leq k\}+1 dpi,1=max{dpj,1aiajk}+1
d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示前i个字符中,对与第i个字符删除保留的最多字符个数, d p [ i ] [ 1 ] dp[i][1] dp[i][1]同理, 1 1 1代表不删除。

这样并不是很好dp,但是通过题解中发现的性质我们可以在 O ( n q + n l o g n ) O(nq+nlogn) O(nq+nlogn)时间内解决问题.

那么题解的性质是什么意思呢,就是说 d p [ i ] [ 1 ] dp[i][1] dp[i][1]的最优解仅可能被两个位置更新,即在 [ a i − k , a i ] [a_i-k,a_i] [aik,ai]中离 a i a_i ai最近的点 a j 1 a_{j_1} aj1所在的索引 j 1 j_1 j1,和在 [ a i , a i + k ] [a_i,a_i+k] [ai,ai+k]中离 a i a_i ai最近的点 a j 2 a_{j_2} aj2所在的索引 j 2 j_2 j2.

为什么呢?比如说 [ a i − k , a i ] [a_i-k,a_i] [aik,ai] a c a_c ac更新了 d p dp dp值,并且 c < j 1 c<j_1 c<j1,那么它也会尝试去更新 j 1 j_1 j1位置的 d p dp dp值,如果 j 1 j_1 j1位置的 d p dp dp值没有被更新,二者作用等价,如果更新了,那么用 j 1 j_1 j1位置的 d p dp dp值更新可以使得结果更大,所以有那样一个结论.

所以我们可以用线段树维护当前遍历到 i i i时, [ a i − k , a i ] [a_i-k,a_i] [aik,ai] [ a i , a i + k ] [a_i,a_i+k] [ai,ai+k] a i a_i ai最近的点 a j 2 a_{j_2} aj2所在的索引 J J J.每次dp的时候用线段树查询即可,dp的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
using i128 = __int128;

const int maxn = 1e5+10;
int n,q;
i64 m,k;
int dp[maxn][2]={0};
inline int query(int p,int l,int r,int x,int y,vector<int>&tree){
    if(x<=l&&r<=y) return tree[p];
    int mid = (l+r)>>1;
    int ans = 0;
    if(x<=mid) ans = max(ans,query(p*2,l,mid,x,y,tree));
    if(y>mid) ans = max(ans,query(p*2+1,mid+1,r,x,y,tree));
    return ans;
}

inline void update(int p,int l,int r,int x,int num,vector<int>&tree){
    if(l==r){
        tree[p] = num;
        return;
    }
    int mid = (l+r)>>1;
    if(x<=mid) update(p*2,l,mid,x,num,tree);
    else update(p*2+1,mid+1,r,x,num,tree);
    tree[p] = max(tree[p*2],tree[p*2+1]);
}

inline void solve(){
    cin>>n>>m>>k;
    vector<i64>a(n+1);
    vector<i64>b;
    for(int i = 1;i<=n;++i){
        cin>>a[i];
        b.emplace_back(a[i]);
    }

    sort(b.begin(),b.end());
    int len =b.erase(unique(b.begin(),b.end()),b.end())-b.begin();
    auto find = [&](i64 x){
        return lower_bound(b.begin(),b.end(),x)-b.begin()+1;
    };

    vector<int> tree((len+1)<<2,0);
    vector<int> L(n+1,0),R(n+1,0);
    for(int i = 1;i<=n;++i){
        int l = find(a[i]-k),r = upper_bound(b.begin(),b.end(),a[i]+k)-b.begin(),now  = find(a[i]);
        L[i] = query(1,1,len,l,now,tree);
        R[i] = query(1,1,len,now,r,tree);
        update(1,1,len,now,i,tree);
    }
    cin>>q;
    while(q--){
        int l,r;cin>>l>>r;
        for(int i = l-1;i<=r;++i) dp[i][0]=dp[i][1]=0;
        for(int i = l;i<=r;++i){
            dp[i][0] = max(dp[i-1][0],dp[i-1][1]);
            dp[i][1] = 1;
            if(L[i]>=l&&L[i]<=r) dp[i][1] = max(dp[L[i]][1]+1,dp[i][1]);
            if(R[i]>=l&&R[i]<=r) dp[i][1] = max(dp[R[i]][1]+1,dp[i][1]);
        }
        cout<<r-l+1-max(dp[r][0],dp[r][1])<<"\n";
    }
}

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--){
        solve();
    }
    return 0;
}



新学到的知识,在q里面开固定长度的vector会超时.
离散化的处理手法,因为我的线段树索引要从1开始用所以,离散化的时候用的是lower_bound(…)+1,对于左界来说这样没有问题,但是对于右界来说就有问题,如果我的右界不在离散化数组里,那么lower_bound(…)本身就相当于已经映射好的正确的离散化右界,+1会出错,这个画个图立得

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教学类-52-14】20240925动物数独(N宫格通用版)1图、2图、6图、有答案、无答案 组合版18套

背景需求&#xff1a; 制作了3-5宫格&#xff08;1、2、6图&#xff09;样式18组&#xff0c;它们用的都是&#xff08;1、2、6图&#xff09;的word模板&#xff0c;只是宫格数量不同&#xff0c;图片插入大小不同&#xff0c;是否可以做一个通用代码&#xff1f; 【教学类-…

C#算法(16)—获取上升沿和下降沿信号

前言 我们在上位机软件开发的时候有时候需要抓取一个信号的上升沿或者下降沿,这时候就需要我们自己编写程序来实现抓取上升沿和下降沿的功能,详细内容如下: 一个信号从“无”到“有”,然后再从“有”到“无”,经历的过程如下:无-上升沿-有-下降沿-无,这样5个过程。 1…

基于微信小程序的电影院订票选座系统ssm(lw+演示+源码+运行)

摘 要 通过移动互联网这几年的发展&#xff0c;单独的开发某些APP已经到了日暮西山的地步&#xff0c;原因不在于单个的APP功能丰富与否&#xff0c;而是因为用户生态体系的问题。使用智能手机的用户经过多年的使用习惯&#xff0c;已经越来越不喜欢安装各种的APP&#xff0c;…

mysql 05 InnoDB数据页结构

01.数据页结构的快速浏览 02.记录在页中的存储 在页的7个组成部分中&#xff0c;我们自己存储的记录会按照我们指定的 行格式 存储到 User Records 部分。但是在一开始生成页的时候&#xff0c;其实并没有 User Records 这个部分&#xff0c;每当我们插入一条记录&#xff0c…

建立队列,插入队列,删除队列

代码&#xff1a; #include<iostream> using namespace std; template<class T> class sq_Queue {private:int mm;int front;int rear;int s;T *q; public:sq_Queue(int);void prt_sq_Queue();int flag_sq_Queue();void ins_sq_Queue(T);T del_sq_Queue(); }; tem…

【线程】自旋锁和读写锁

自旋锁 以前所讲的是挂起等待锁&#xff0c;申请锁成功继续执行&#xff0c;申请失败挂起等待 挂起等待和唤醒是需要时间的&#xff0c;有没有一种锁不会挂起等待呢&#xff1f;那就是自旋锁&#xff0c;申请锁失败它不会挂起&#xff0c;他会轮询&#xff0c;一直让我们的线…

如何给文件设置密级权限查看

一、使用文件加密软件&#xff1a; 选择专业的加密软件&#xff0c;如BitLocker&#xff08;Windows内置&#xff09; 对需要设置密级的文件进行加密&#xff0c;并设置访问密码。 这样&#xff0c;只有拥有正确密码的人才能查看或访问该文件。 二、第三方加密工具&#xff…

《Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images》论文阅读

学习资料 论文题目&#xff1a;Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images&#xff08;低分辨率UAV遥感图像中茶叶枯萎病的检测&#xff09;论文地址&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber10345618 Abstr…

这个博览会不一般,丰收的背后故事多!

在金秋送爽、硕果累累的季节里&#xff0c;我们迎来了第七个中国农民丰收节&#xff0c;2024 年 9 月 24日&#xff0c;“中国农民丰收节毕节庆祝活动第三届毕节天麻博览会”在七星关区盛大开幕&#xff0c;一场办在农民心坎上的庆丰收活动精彩上演&#xff01;这是一场属于农民…

手把手教程 | 在 Azure OpenAI 服务上微调 4o 模型

兴奋起来——你现在可以使用 Azure OpenAI 服务微调 4o&#xff01; 我们很高兴地宣布在 Azure 上推出 4o 微调的公开预览版。在成功进行私人预览后&#xff0c;4o 现已可供我们所有的 Azure OpenAI 客户使用&#xff0c;在 Azure OpenAI 服务中提供无与伦比的定制和性能。 …

通信工程学习:什么是ODN光分配网络

ODN&#xff1a;光分配网络 ODN&#xff08;Optical Distribution Network&#xff0c;光分配网络&#xff09;是光接入网中的重要组成部分&#xff0c;它位于光线路终端&#xff08;OLT&#xff09;和光网络单元&#xff08;ONU&#xff09;/光网络终端&#xff08;ONT&#x…

itc保伦股份智慧高校整体解决方案推动教育强国、科技强国、人才强国建设!

党的二十大报告指出&#xff0c;要“统筹职业教育、高等教育、继续教育协同创新&#xff0c;推进职普融通、产教融合、科教融汇&#xff0c;优化职业教育类型定位”。itc积极响应高校人才培养相关政策要求&#xff0c;基于互联网、物联网、大数据、AI等技术&#xff0c;面向老师…

高性价比的电脑桌面记事本便签,好用便签助力工作效率

在快节奏的工作环境中&#xff0c;我们常常需要快速记录下重要的信息和任务。而一款好用的电脑桌面记事本便签工具&#xff0c;可以成为我们提高工作效率的得力助手。在这里&#xff0c;向大家介绍一款高性价比的电脑桌面记事本便签&#xff0c;好用便签&#xff0c;帮助大家更…

100个ChatGPT学术指令—助你高效完成文献综述撰写!

写文献综述是不是让你觉得头大&#xff1f;每次翻了半天资料&#xff0c;脑子还是一片空白&#xff0c;根本不知道从哪儿开始写&#xff1f; 别慌&#xff0c;其实有个简单的套路——用AI&#xff01;没错&#xff0c;只要掌握好提示词&#xff0c;AI能帮你快速理清思路、找到…

Linux系统备份Gitee等云git所有仓库与所有分支的数字资产

思路&#xff1a; 1. ssh 配置 2. reps.txt 列出所有仓库名 3. exp的自动化备份脚本 -- 环境安装&#xff1a; exp需要依赖安装的文件&#xff0c;所以先执行下(以ubuntu为例)&#xff1a; sudo apt-get install expect 操作步骤&#xff1a; ssh 配置 1. 添加公钥至 …

23. Lammps命令学习-8之read_dump

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Lammps命令学习-8之read_dump read_dump file … 从dump文件中读取原子信息以覆盖当前原子坐标以及原子速度和图像标志、时间步长和模拟盒尺寸等&#xff0c;以便可以从dump文件中的特定快照重新启动模拟。   https…

[笔记]某川电机变频器指标与参数

变频器是进行电机控制的一个参考源&#xff0c;所有这些电机厂商的产品中提及的功能模块&#xff0c;项点&#xff0c;都需要关注。 某些功能点&#xff0c;自定义的分类&#xff0c;都是一些可以用作参考和进一步扩展的一些基本的技术点。软硬件接口&#xff0c;可以在设计自…

2023国赛C题 蔬菜类商品的自动定价与补货决策(上)

2023国赛C题 蔬菜类商品的自动定价与补货决策&#xff08;上&#xff09; 符号说明&#xff1a; 问题1 问题1主要的代码和思路在上一篇文章“数学建模实战块速入门”中已经进行了较为详细的展示&#xff0c;在问题一种要求我们从蔬菜单品和品类两个维度去分析各自之间的关系。…

C# 面向对象基础,简单的银行存钱取钱程序

题目&#xff1a; 代码实现&#xff1a; BankAccount部分&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Bank {internal class BankAccount{private decimal balance 0;//账…

黑马智数Day5

表单校验 表单基础校验 // 1. 创建表单规则 data() {return {addRules: {name: [{ required: true, message: 企业名称为必填, trigger: blur }],legalPerson: [{ required: true, message: 法人为必填, trigger: blur }],registeredAddress: [{ required: true, message: 注…