首页 > 其他分享 >cf433c-ti-jie

cf433c-ti-jie

时间:2024-05-08 18:25:05浏览次数:21  
标签:jie int sum ans mid 最小 cf433c ti

CF433C

思路

出于习惯,调换 $n$ 和 $m$,$n$ 为数组长度,$m$ 为值域。

考虑枚举被替换的 $a_i$。枚举值域 $1$ 到 $m$ 的权值 $x$。

每个权值为 $x$ 的点 $a_i$ 的贡献是 $\mid a_i-a_{i-1} \mid+\mid a_i-a_{i+1} \mid$。由于 $a_i$ 被更改,贡献会随之变化,与之有关的是所有 $a_i$ 的左右两边的点。将这些点全部放进 vector 里。设 $p_x$ 表示所有这样的点。

如果要把 $x$ 改为 $y$ 并令 $ans$ 最小,受影响的是 $\sum \mid x-p_{i,j} \mid$ 变为 $\sum \mid y-p_{i,j} \mid$,要使 $\sum \mid y-p_{i,j} \mid$ 最小。

由 $\textbf{初一}$ 知识,当取 $y$ 为 $p_{i,0}$ 到 $p_{i,len}$ 的中位数时,式子最小。一开始我以为是平均数,整半天。

用最开始算出的不修改答案 $num$ 减去 $\sum \mid x-p_{i,j} \mid$ 加上 $\sum \mid y-p_{i,j} \mid$ 得到修改 $x$ 的最小答案,再取最小值。

code

int n,m,a[maxn],ans,num;
vector<int> p[maxn];
int sum,x,sum1;

int T;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);

	m=read();n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		if(i!=1)num+=abs(a[i]-a[i-1]);
	}
	for(int i=1;i<=n;i++){
		if(a[i-1]&&a[i-1]!=a[i])p[a[i]].push_back(a[i-1]);
		if(a[i+1]&&a[i+1]!=a[i])p[a[i]].push_back(a[i+1]);
	}
	ans=num;
	for(int i=1;i<=m;i++){
		if(p[i].size()){
			sort(p[i].begin(),p[i].end());
			sum=sum1=0;x=p[i][p[i].size()/2];
			for(int j=0;j<p[i].size();j++){
				sum+=abs(i-p[i][j]);
				sum1+=abs(x-p[i][j]);
			}
			ans=min(ans,num-sum+sum1);
		}
	}
	printf("%lld\n",ans);
}

标签:jie,int,sum,ans,mid,最小,cf433c,ti
From: https://www.cnblogs.com/yhddd/p/18180564

相关文章

  • cf396c-ti-jie
    CF396C思路对于一个点维护$b_i=a_i-a_{fa_i}$。对于操作一,等价于$b_u$加$x$,$u$的子树不含$u$的每个点和父亲的差都减$k$。对于操作二,等价于从根到$u$路径上的$b_x$的和。同P3178,子树加,路径查,树剖加线段树。codeintn,q;inthead[maxn],tot;structnd{ intnxt......
  • at_joi2020ho_b-ti-jie
    AT_joi2020ho_b另,这道题也是P6878,数据应该是强一些。思路枚举起始的位置$i$,显然$c[i]=J$,即枚举$J$的位置。为了使操作三删除中间的字符更少,问题转换对于为从$i$起的最短的包含一个$k$阶字符串的字符串的长度。有点绕。那么从$i$位置起,向后找$k-1$个$J$,记录位置......
  • at_dp_j-ti-jie
    AT_dp_j思路期望dp。设$dp_{i,j,k,l}$表示当前有$0,1,2,3$个寿司的盘子数有$i,j,k,l$个时的期望次数。显然MLE。但可以发现$i+j+k+l=n$,所以可以去掉一维。设$dp_{i,j,k}$表示当前有$1,2,3$个寿司的盘子数有$i,j,k$个时的期望次数。首先有$dp_{0,0,0}=0$。......
  • a-story-of-the-small-p-ti-jie
    「2020-2021集训队作业」AstoryofTheSmallP题意给定$N,m,k$,求有多少个正整数序列h满足:h的长度$n$满足$1\leqn\leqN$。$1\leqh_i\leqm$。正好存在$k$个$i$满足$h_i<h_{i+1}$。答案模$998244353$。$2\leqN,m,k\leq2^{19},(N-k+1)\timesm\l......
  • arc162f-ti-jie
    arc162f思路$a_{x1,y2}\timesa_{x2,y2}\leqa_{x1,y2}\timesa_{x2,y1}$改为所有$a_{x1,y1}=a_{x2,y2}=1$,都有$a_{x1,y2}=a_{x2,y1}=1$。观察发现,第$i$行$a_{i,j_1}=\ldots=a_{i,j_{num}}=1,(j_1<\ldots<j_{num})$,第$ii,(ii>i)$行能取$1$的位置是$[1,j_1-1]$和......
  • arc119f-ti-jie
    arc119f自动机写法。开始在做的时候题解没讲每个节点代表什么状态,自己推了一遍,记录一下。思路计数,求有多少种替换方式使得$0$到$n$存在一条长度小于等于$K$的路径。可以做$O(n^3)$的dp。设$dp_{i,a,b}$表示前$i$个位置,最近的$A$和$B$分别在$a$和$b$。官方......
  • arc106d-ti-jie
    ARC106D思路左边到右边不好,改为任意一个到另一个。$$ans_x=\frac{1}{2}(\sum_in\sum_jn(a_i+a_j)x-\sum_in(2\timesa_i)^x)$$拆开$k$次方。$$(a_i+a_j)x=\sum_{k=0}x(\binom{x}{k}\times{a_i}^k\times{a_j}^{x-k})$$$$ans_x=\frac{1}{2}(\sum_{k=0}x(\sum_in{a_i}^......
  • agc049a-ti-jie
    agc049a思路期望。与CF280C相似的思路。每个点最多被做一次,或者被其他点影响。设$f_i$表示$i$是否被选,为$0$或$1$。答案为$E[\sumf_i]$,即$\sumf_i$的期望。$$ans=E[\sumf_i]=\sumE[f_i]=\sump_i$$所以答案为每个点被选的概率的和。能影响点$i$使其不被......
  • abc349g-ti-jie
    abc349g思路从前往后枚举$i$,每次对$i+1\lej\lei+a_i$的$j$赋值$b_j=b_{i\times2-j}$。同时有$b_{i+a_i+1}\neb_{i-a_i-1}$。用$ban_{i,j}$记录$i$不能是$j$,如果要给$i$赋值就选最小的。最直接的就是并查集倍增将两段区间并起来。可以用类似马拉车的思路得......
  • Elements in iteration expect to have 'v-bind:key' directives.
    当组件中使用v-for时,如果不指定key,则会有红色警告信息。解决方案如下。方案一:绑定key(亲试有效)//方式一<liv-for="(item,index)inlist":key="index">//方式二<liv-for="(item,index)inlist":key="item.id">//方式三<liv-for="(item,in......