[ARC182D] Increment Decrement Again

[ARC182D] Increment Decrement Again

My Blogs

[ARC182D] Increment Decrement Again

判掉 m=2。接下来有个奇妙的转化:看成 A 不对 m 取模,要求变为 i<n,|aiai+1|<maiai+1

然后发现 a 的大小关系是不会变的,所以如果固定了 a1,则后面的都是固定的。可以先令 a1=b1,根据大小关系求出任意一组合法的 a,接下来问题变为最小化 i=1n|aiaikm|,可以二分类似找中位数的方法解决。复杂度 O(nlognlogV)

int n,m,L,R,mid,p,a[200010],b[200010],c[200010];
inline void mian()
{
	read(n,m);
	for(int i=1;i<=n;++i)read(a[i]);
	for(int i=1;i<=n;++i)read(b[i]);
	if(m==2){if(a[1]==b[1])puts("0");else puts("-1");return;}
	c[1]=b[1];
	for(int i=2;i<=n;++i)
	{
		int val=(b[i]-b[i-1]+m)%m;
		if(a[i]>a[i-1])c[i]=c[i-1]+val;
		else c[i]=c[i-1]+val-m;
	}
	for(int i=1;i<=n;++i)c[i]=a[i]-c[i];
	sort(c+1,c+1+n),L=-1000*inf,R=1000*inf;
	while(L<R)
	{
		mid=L+((R-L+1)>>1),p=lower_bound(c+1,c+1+n,mid*m)-c;
		if(p<=(n+1)/2)L=mid;
		else R=mid-1;
	}
	int ans=0,s=0;
	for(int i=1;i<=n;++i)ans+=abs(c[i]-L*m);
	for(int i=1;i<=n;++i)s+=abs(c[i]-(L+1)*m);
	write(min(ans,s));
}
posted @   WrongAnswer_90  阅读(49)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

This blog has running: 562 days 8 hours 45 minutes 0 seconds

点击右上角即可分享
微信分享提示