首页 > 其他分享 >ACwing 334 K匿名序列

ACwing 334 K匿名序列

时间:2023-11-14 22:35:43浏览次数:32  
标签:int 334 ll cdot 匿名 答案 一段 序列 ACwing

首先这道题很容易发现如果已经知道了最后的答案序列,那么操作顺序是无所谓的

所以我们可以假设从头操作到尾

由于题目给的是非严格递增序列,我们猜想最后的答案一定是一段一段的,段与段之间单调递增

比如1 1 1 2 2 2 2 2 3 3 4 5 5

反证:如果最终的答案序列存在\(a_{i}\)和\(a_{j}\),其中\(i<j\)且\(a_{i}>a_{j}\),那我们让\(a_{i}\)变成\(a_{j}\),\(a_{j}\)变成\(a_{i}\),则改变后的序列仍然符合题意而且总操作次数不变,所以最终的答案序列没有逆序对

这样就简单了,我们设\(f_{i}\)表示前\(i\)个数字的最小操作次数,考虑最后一个数字最终会变成什么样,由题,每一段的大小是大于等于k的

所以有$$f_{i}=min_{j=k}^{i} (f_{i-j}+\sum_{k=i-j+1}^{i}(a_{k}-a_{i-j+1}))$$

这里运用了一个小贪心:每一段的最开始的数字一定不会变化,变化了肯定没有不变化优

拆开后发现\(i-j\)不好看,为了符合习惯,让\(m=i-j\)

于是有$$s_{m}-f_{m}-m\cdot a_{m+1}=-i\cdot a_{m+1}-f_{i}+s_{i}$$

这里发现斜率是负数,而且绝对值越来越大,不能运用让队头出队,必须要运用二分查找

然而,这个时候我们只需要将原式取反就迎刃而解了:

\[-s_{m}+f_{m}+m\cdot a_{m+1}=i\cdot a_{m+1}+f_{i}-s_{i} \]

然后就是套模板了

代码有注释,一定要看

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
int t;
int n,k;
ll a[N],s[N],f[N];
int l,r,q[N];
ll F(int x)
{
	return f[x]+x*a[x+1]-s[x];
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&k);
		for(int i=1;i<k;i++) f[i]=0x7fffffff;
		//这个初始化一定要有
		//因为当i<k时是不合法的
		//我们不能让之后的状态从这些状态转移过来 
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
			s[i]=s[i-1]+a[i];
		}
		l=r=1;
		q[1]=0;
		for(int i=k;i<=n;i++)
		{
			while(l<r&&F(q[l+1])-F(q[l])<=i*(a[q[l+1]+1]-a[q[l]+1])) l++;
			f[i]=F(q[l])+s[i]-i*a[q[l]+1];
			while(l<r&&(F(i-k+1)-F(q[r]))*(a[q[r]+1]-a[q[r-1]+1])<=(F(q[r])-F(q[r-1]))*(a[i-k+1+1]-a[q[r]+1])) r--;
			q[++r]=i-k+1;
			//这里放的是i-k+1
			//对应的是博客中的m 
		}
		printf("%lld\n",f[n]);
	 } 
	return 0;
}

标签:int,334,ll,cdot,匿名,答案,一段,序列,ACwing
From: https://www.cnblogs.com/dingxingdi/p/17832754.html

相关文章

  • 抖音直播间采集截流软件,截流匿名WSS接口协议,易语言提取源码分享
    接口什么都是对接易语言的,易语言源码,然后最主要它不调用本地浏览器,所以说你有技术基础的话可以实现多线程采集的效果,我这个仅仅只是源码,多余功能就没有了,当然支持匿名奥。框架设计图:采集效果图:易语言源码:【核心代码】===================================================.版本2.......
  • 抖音直播间抓取用户数据的软件,ID安全码评论内容礼物,匿名易语言源码WSS
    这个也是我用易语言开发的,调用的WSS接口,用的是浏览器协议,好处是非常稳定,不会掉包,目前只提供源码,下面会分享出来。采集效果图:  易语言源码:===============================================================.版本2.支持库spec.支持库EThread.支持库e2ee.程序集窗口程序集_启......
  • 抖音直播间抓取用户数据的软件,ID安全码评论内容礼物,匿名易语言源码WSS
    这个也是我用易语言开发的,调用的WSS接口,用的是浏览器协议,好处是非常稳定,不会掉包,目前只提供源码,下面会分享出来。采集效果图:  易语言源码:===============================================================.版本2.支持库spec.支持库EThread.支持库e2ee.程序集窗......
  • 抖音直播间匿名采集软件,带接口wss,易语言源码分享
    软件是易语言开发的,然后不用调用浏览器,直接截取wss数据,客户采集匿名的数据,源码我这边会公开,核心的部分。采集出来的效果:易语言核心代码:=================================================.版本2.支持库EThread.支持库spec.程序集窗口程序集_窗口1,,,744894369.子程序_窗......
  • 抖音直播间匿名采集软件,带接口wss,易语言源码分享
    软件是易语言开发的,然后不用调用浏览器,直接截取wss数据,客户采集匿名的数据,源码我这边会公开,核心的部分。框架图: 采集出来的效果 易语言核心代码:=================================================.版本2.支持库EThread.支持库spec .程序集窗口程序集_窗口1,......
  • Acwing.第 129 场周赛
    Acwing.第129场周赛比赛地址A.字符串题目思路:只需要用到reverse()反转函数就可以代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; reverse(s.begin(),s.end()); cout<<s<<endl; }intmain(){ intt=1; while(t--){ solv......
  • AcWing785
    AcWing785.快速排序一、题目描述给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数n。第二行包含n个整数(所有整数均在1∼1091∼109范围内),表示整个数列。输出格式输出......
  • AcWing785
    AcWing785.快速排序一、题目描述给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数n。第二行包含n个整数(所有整数均在1∼1091∼109范围内),表示整个数列。输出格式输......
  • 内部类:成员内部类、静态内部类、局部内部类、匿名内部类
     成员内部类  ......
  • java lambda表达式、匿名类和接口
    从匿名类重写已有类的方法开始这段代码,在AnonymousDemo内部创建了一个Polygon类的p1对象但这个Polygon类内部的方法被重写了,是一个匿名类,内部类和外部类重名,重写了内部的方法这个机制应该理解为继承,内部的Polygon继承了外部的Polygon类,重写了display方法,Polygon的其他没被重写......