首页 > 其他分享 >[题解]P4597 序列 sequence

[题解]P4597 序列 sequence

时间:2024-05-01 17:45:00浏览次数:29  
标签:10 P4597 sequence 不降 题解 long 中间 序列

P4597 序列 sequence
CF13C Sequence的加强版,\(N\leq 5*10^5\)。

如果想了解\(O(N^2)\)的DP解法请看此文


给定\(N\)个数,每次操作可以选其中一个数\(+1\)或\(-1\)。请问要让这个数列不降,最少需要多少次操作?

看到数据范围发现不能用\(O(N^2)\)的dp了,需要换一种思路。

我们用类似贪心的方法做,从左往右找\(i<j,a_i>a_j\)(注意\(i,j\)不一定连续,后面就懂了),然后对它们的值进行上调下调。

如上图,我们发现\(10\to 1\)不满足“不降”,需要进行调整。我们想到在\([1,10]\)中找到一个中间点,把这\(2\)个数都移动到中间点。而无论中间点是几,这一操作代价都为\(10-1=9\)。那么我们为了让操作次数尽可能小,我们应该尽可能让中间点往下,即移动到\(1\)。

总结:如果遇到\(x\)在\(y\)后面,而\(x>y\),我们需要把\(y\)下移到\(x\)的位置。从左到右遍历每条边,重复上述操作即可。

大家可能会有疑惑:如果\(y\)前面的\(z\),满足\(x<z<y\),如果把\(y\)下移到\(x\),就会破坏前面的“不降”:

  • 如果\(z\)后面又遇到一个值\(a_i<a_{i-1}\),而它之前的最小值正是\(z\),它就会把\(z\)压下去。
    但如下图,我们又发现,\(z\)下调后,后边又不满足不降,此时就把\(x\)作为\(z\)循环上面的步骤。

  • 如果\(z\)后面没有更低的值,则说明\(y\)没必要降到\(x\),中间点可以上移到\(z\)也不会影响结果,但在此同时我们让原序列合法了。而中间点只要在\([x,y]\)中间,消耗就相同,所以答案不受影响。

综上,答案不会受下移的影响,尽管序列可能不满足“不降”,但我们可以在消耗不变的情况下调整至满足条件。


接下来就是代码实现。为了维护前面的最大值,我们开一个优先队列。
对于输入的每一个\(x\):
首先加入\(x\)。
如果遇到\(x<max\),则\(ans+=max-x\),然后\(max\)出队列,加入下调后的高度\(x\)。

时间复杂度\(O(N\log N)\)。

虽然加强版空间限制从64MB提升到了125MB,但是这份代码可以过CF的原题,因为空间消耗只有\(\log N\)而已。

注意开long long

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
priority_queue<int> q;
int n,x,ans;
signed main(){
	cin>>n;
	while(n--){
		cin>>x;
		q.push(x);
		if(x<q.top()){
			ans+=q.top()-x;
			q.pop();
			q.push(x);
		}
	}
	cout<<ans;
	return 0;
}

标签:10,P4597,sequence,不降,题解,long,中间,序列
From: https://www.cnblogs.com/Sinktank/p/18169491

相关文章

  • [题解]CF13C Sequence
    CF13CSequence给定\(N\)个数,每次操作可以选其中一个数\(+1\)或\(-1\)。请问要让这个数列不降,最少需要多少次操作?我们用DP解决。对\(a\)从小到大排序,存在\(c\)中。我们用\(f[i][j]\)表示让前\(i\)个元素满足条件,而且这些元素最大值不超过\(c[j]\)的最小操作次数。状态转移方......
  • 异或与区间加题解
    异或与区间加题解简要题意给定\(n,m,K,a_{1...n}\),和\(m\)个三元组\((x_i,y_i,z_i)\),定义\(calc(l,r)=a_l\bigoplusa_{l+1}\bigoplus...\bigoplusa_r\)。对于每个三元组\((x,y,z)\),对所有满足\(x\lel\ler\ley\,\calc(l,r)=K\)的区间\((l,r)\)内的每个数\(b......
  • CF1967B2 Reverse Card (Hard Version) 题解
    题意:求有多少对\((a,b)\)满足\(b\times\gcd(a,b)\equiv0\pmod{a+b},1\lea\len,1\leb\lem\)。首先我们设\(\gcd(a,b)=G,a=i\timesG,b=j\timesG\),显然有\(\gcd(i,j)=1\)。那么可以把原条件转化为\(j\timesG\)是\((i+j)\)的倍数。因为\(\gcd(i+......
  • Codeforces Round 942 Div.2 题解
    蹭个热度,挽救一下cnblogs蒸蒸日上的阅读量。Q:你是手速狗吗?A:我觉得我是。2A因为选的\(w\)一定可以让它合法,一次操作可以看作\(a\)数组向右平移一位。枚举操作次数后暴力判断即可。#include<bits/stdc++.h>voidwork(){ intn; std::cin>>n; std::vector<......
  • 【题解】 量化交易5
    题目描述applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:......
  • Educational Codeforces Round 165 (Rated for Div. 2) 题解
    A对于\(i\top_i\)连边。如果存在二元环,则答案为2。否则答案为3。B非降序排序:0全部在1前面。令0的个数为z。从左往右,将前z个全部填上0。填第\(i\)位时,每次填的最小代价为:若第\(i\)位为1,第\(i\)位右边的第一个0到\(i\)之间的字符个数。(贪心)......
  • 【题解】 量化交易4
    题目描述applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:......
  • 【题解】 量化交易3
    题目描述applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:......
  • CF1765C Card Guessing 题解
    考虑期望的线性性,求每种情况猜对的概率和,最终再除掉\({4n\choosen,n,n,n}\)。考虑枚举最少的出现次数\(mn\),记四种卡的出现次数分别为\(c_1,c_2,c_3,c_4\),\(c_1+c_2+c_3+c_4=i\lek\),则这种情况的方案数为:\[{i\choosec_1,c_2,c_3,c_4}{4n-i\choosen-c_1,n-c_2,n-c_3,n-c_......
  • 题解 CF1965E【Connected Cubes】
    场切了1E,第一次上IGM,纪念一下。多图警告。我们称题目中的一个方块为“某色混凝土”。感受一下,发现本题主要的难点在于这些混凝土方块排布得太紧密了,导致容易出现互相遮挡的现象,进而难以构造。于是,我们先思考能否通过一些操作使得这些混凝土互相分离。如下图的方式可以将每两......