首页 > 其他分享 >P2501 [HAOI2006] 数字序列

P2501 [HAOI2006] 数字序列

时间:2024-11-14 22:58:15浏览次数:1  
标签:typedef int long P2501 HAOI2006 序列 define

[题目链接]([P2501 HAOI2006] 数字序列 - 洛谷 | 计算机科学教育新生态)

首先是第一问,直接求不好求,我们们考虑求不用更改的数量,发现有这个性质,如果,a[i] - a[j] < abs(j - i)两个数的差值能满足他们之间有足够多数的情况,例如1 4 5 3,取1 和 3,那么就有2 < 3, 中间的4 和 5 怎么改也不会单调上升

所以, 经过移项得a[i] - i < a[j] - j 即可,这就具有了,求最长的上升a[i] - i 即可,用b数组存下来是求最大上身子序列

这是第一问

第二问我们假如以i为最后一位的子序列的前一个状态时pre[i] 我们要把之间的数全都修改一遍,那就得让左边某一部分等于b[from],另一部分等于b[i],枚举这个分区即可求得从from到i这区间变为单调递增的最小花费,总花费加上from之前的就行

// Problem: P2501 [HAOI2006] 数字序列
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2501
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//by codeforcer ——
//  ____  _   _  _   _  _   _   ____    _ 
// / ___|| | | || | | || | | | |___  \ | |
//| |    | |_| || |_| || |_| |   __) | | |
//| |    |  _  ||  _  ||  _  |  |__  < | |
//| |___ | | | || | | || | | |  ___) | | |
// \____||_| |_||_| |_||_| |_| |____ / |_|


#include<bits/stdc++.h>
using namespace std;

typedef int E;
typedef long long LL;
typedef pair<int, int> PII;
typedef tuple<int, int, int> PIII;
typedef tuple<LL, LL, LL> PLLL;
typedef pair<long long, long long> PLL;
typedef unsigned long long ULL;

#define endl '\n'
#define vec vector
#define pb push_back
#define pob pop_back
#define fir first
#define sec second
#define maxINT 0x3f3f3f3f
#define maxLL 0x3f3f3f3f3f3f3f3fLL
#define umap unordered_map
#define uset unordered_set
#define maxheap priority_queue<E, vector<E>, less<E>>
#define minheap priority_queue<E, vector<E>, greater<E>>

#define prvec(a)                			\
    for (int i = 0; i < (a).size(); i++) {	\
        cout << (a)[i] << " ";   			\
    }                            			\
    cout << endl;

#define debugvec(a, i, n)             		\
    cout << #a << ": ";               		\
    for (int k = (i); k <= (n); k++) { 		\
        cout << (a)[k] << " ";        		\
    }                                 		\
    cout << endl;							

LL gcd(LL a, LL b) { return (b) ? gcd(b, a % b) : a; }
LL exgcd(LL a, LL b, LL &x, LL &y) {if (b == 0) { x = 1, y = 0; return a; }LL gcd = exgcd(b, a % b, y, x);y -= a / b * x;return gcd;}
LL qmi(LL a, LL b, LL mod) {LL res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;}

const int N = 3e4 + 5e3;
long long top[N],f[N],g[N];
long long pre[N],sub[N],b[N];
vector<int> ed[N];

void solve() {
    int n;
    cin>>n;
    
    vec<long long> a(n + 3);
    
    for(int i = 1;i <= n;i ++)
    {
    	cin>>a[i];
    	b[i] = a[i] - i;
    }
    b[0] = -(1e9+2093),b[n + 1] = 1e9 + 2330;
    int cnt = 0;
    for(int i = 1;i <= n+1;i ++)
    {
    	int l = 0,r = cnt;
    	while(l < r)
    	{
    		int mid = (l + r + 1)>>1;
    		if(top[mid] <= b[i])
    		{
    			l = mid;
    		}else r = mid - 1;
    		
    	}
    	if(l == cnt) cnt ++;
    	f[i] = l + 1;
    	top[l + 1] = b[i];
    	ed[f[i]].pb(i);
    }
    ed[0].pb(0);
    memset(g,20,sizeof g);
    g[0] = 0;
    for(int i = 1;i <= n+1;i ++)
    {
    	for(int j = 0;j < ed[f[i] - 1].size();j ++)
    	{
    		int from = ed[f[i] - 1][j];
    		if(from > i || b[from] > b[i]) continue;
    		pre[from] = sub[i - 1] = 0;
    		
    		for(int k = from + 1;k <= i - 1;k ++)
    		{
    			pre[k] = pre[k - 1] + abs(b[k] - b[from]);
    		}
    		
    		for(int k = i - 2;k >= from;k --)
    		{
    			sub[k] = sub[k + 1] + abs(b[k + 1] - b[i]);
    		}
    		
    		for(int k = from;k <= i - 1;k ++)
    		{
    			g[i] = min(g[i],g[from] + pre[k] + sub[k]);
    		}
    	}   	
    	
    }
    
    cout<<n - cnt+1<<endl<<g[n + 1]<<endl;
    
    
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

        solve();

    return 0;
}

标签:typedef,int,long,P2501,HAOI2006,序列,define
From: https://www.cnblogs.com/chhh31/p/18547036

相关文章

  • 代码随想录算法训练营day46| 647. 回文子串 516.最长回文子序列
    学习资料:https://programmercarl.com/0647.回文子串.html#算法公开课动态规划最后一部分:回文字符串子串是从原字符串中连续截取的;子序列可以是从原字符串中不连续提取出元素构成的学习记录:647.回文子串(难构造dp数组,dp数组是从原字符串截取[i,j]范围的片段是否是回文字符串,布尔......
  • java 反序列化 cc3 复现
    版本要求:jdk版本<=8u65,common-collections版本<=3.2.1在很多时候,Runtime会被黑名单禁用.在这些情况下,我们需要去构造自定义的类加载器来加载自定义的字节码.类加载机制双亲委派这里直接粘别人的了.实现一个自定义类加载器需要继承ClassLoader,同时覆盖findClass方法......
  • java 反序列化 cc4 复现
    复现环境:jdk<=8u65,commonsCollections=4.0CommonsCollections4.x版本移除了InvokerTransformer类不再继承Serializable,导致无法序列化.但是提供了TransformingComparator为CommonsCollections3.x所没有的,又带来了新的反序列化危险.cc4的执行命令部分依然沿用cc3的TemplatesI......
  • 数据结构 ——— 利用前序序列重建链式二叉树
    目录题目要求链式二叉树示意图​编辑代码实现 题目要求读入用户输入的一串前序遍历的字符串,根据此字符串建立一个链式二叉树例如前序遍历的字符串为:ABC##DE#G##F###;其中"#"表示空树链式二叉树示意图以此图的链式二叉树为例子那么此链式二叉树前序遍历转换为字符......
  • 自定义序列化
    #ifndefAI_PACS_JSONTOSTRUCT_H#defineAI_PACS_JSONTOSTRUCT_H#include<iostream>#include<string>#include<unordered_map>#include<variant>#include<vector>#include<nlohmann/json.hpp>#include<stdexcept>......
  • MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测
    目录项目背景介绍...1项目目标与意义...1项目挑战...1项目特点与创新...1项目应用领域...2项目效果预测图程序设计...2项目模型架构...2项目模型描述...2项目模型算法流程图...4项目结构设计...5项目部署与应用...5项目扩展...5项目应该注意事项...5......
  • 代码随想录算法训练营day45| 115.不同的子序列 583. 两个字符串的删除操作 72.
    学习资料:https://programmercarl.com/0115.不同的子序列.html#算法公开课动态规划系列之编辑距离问题学习记录:115.不同的子序列(当遇到相同字母时,可以选择也可以不选;刚开始没看懂;dp[i][j]是对应i-1结尾和j-1结尾,这样的目的是方便第一行和第一列初始化)点击查看代码classSolut......
  • 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义
    2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k,定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。找出nums中长度为k的所有子序列的能量和,对结果取模10^9+7后返回。输入:nums=[1,2,3,4],k=3。输出:4。解释:......
  • 代码审计:TP5 框架及无框架变量覆盖与反序列化
    目录代码审计:TP5框架及无框架变量覆盖与反序列化一、什么是TP5框架及无框架变量覆盖与反序列化审计二、原理(一)变量覆盖原理(二)变量覆盖与文件包含漏洞结合原理(三)反序列化原理(文中虽未详细提及,但为完整理解可补充)三、步骤与代码示例(一)准备工作(二)审计步骤与代码分析......
  • P2779 [AHOI2016初中组] 黑白序列题解
    题意:小可可准备了一个未完成的黑白序列,用B和W表示黑色和白色,用?表示尚未确定。他希望知道一共有多少种不同的方法,在决定了每一个?位置的颜色后可以得到一个小雪喜欢的黑白序列。其中,小雪喜欢的黑白序列指的是对于任何正整数\(n\),由连续\(n\)个黑接上连续\(n\)个白......