当前位置: 首页 > article >正文

XMOJ3376 结界

很憨憨的题,想复杂了,是这场比赛四道题中难度第二的,可却是我唯一没做出来的题,挡了我的AK路。(发怒)(难得过一次最难题)

题目大意

有一个环,第 i i i 个位置上有 a i a_i ai 个物品,定义一次操作为将一个位置上的一个物品移动到其相邻两个位置之一,求最少的操作次数使得第 i i i 个位置上有 b i b_i bi 个物品。

n ≤ 1 0 5 n≤10^5 n105 a , b ≤ 1000 a,b≤1000 a,b1000

题解

先讲讲我赛时磕这题的心路历程。读完题发现 a , b a,b a,b 范围不大,所以一直在把复杂度往 a , b a,b a,b 上靠,然后一直往 dp 那个方向想,然后就憨完了。看了题解才发现很不牛,感觉如果 a , b a,b a,b 范围改成 1 0 9 10^9 109 赛时应该就会做了……

先考虑如果是一条链怎么做,很显然是贪心的去搞他,对于每个位置若是 a a a b b b 大就把多余部分弄出来,若是少就把多出来的部分搞进去。统计答案时只需要算一下每条边需要经过几个物品即可。(以上便是我赛时想出来的部分和正解的交集。)

再考虑变成环,其实也就是往1和n之间加了条边,我们假设这条边经过了 x x x 个物品(为正则从1到n方向,否则从n到1方向),那么1的物品数量就变成了 a 1 − x a_1-x a1x,1还需要的物品数量就是 b 1 − a 1 + x b_1-a_1+x b1a1+x(为正则给出去)。而此时只有2连向1的边能移动物品(因为1到n的边通过的物品数量已经被钦定好了),所以这条边所需要通过的物品数量就是 b 1 − a 1 + x b_1-a_1+x b1a1+x,然后2的物品数变成了 a 2 − b 1 + a 1 − x a_2-b_1+a_1-x a2b1+a1x,2还需要的物品数量就是 b 2 − a 2 + b 1 − a 1 + x b_2-a_2+b_1-a_1+x b2a2+b1a1+x,而此时只有3连向2的边能移动物品,所以这条边通过的物品数量就是 b 2 − a 2 + b 1 − a 1 + x b_2-a_2+b_1-a_1+x b2a2+b1a1+x……以此类推,我们可以算出每条边通过的物品数。

最后的答案就是每条边通过的物品数绝对值相加,发现每条边通过的物品数除了 x x x 以外都是一个常量,不妨设为 c i c_i ci,那么结果就是 ∑ ∣ c i + x ∣ = ∑ ∣ c i − ( − x ) ∣ \sum |c_i+x|=\sum |c_i-(-x)| ci+x=ci(x),然后就是很经典的问题,直接取中位数即可。

复杂度可以 O ( n ) O(n) O(n),但取中位数我为了方便用了 sort 所以是 O ( n l o g n ) O(nlogn) O(nlogn)

Code

代码巨简洁。

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

const int N=1e5+5;
typedef long long ll;

int n,m,a[N],b[N],c[N];
ll ans;

int main(){
	freopen("border.in","r",stdin);
	freopen("border.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&a[i],&b[i]);
	c[1]=0;
	for(int i=2;i<=n;i++)
		c[i]=c[i-1]+b[i-1]-a[i-1];
	sort(c+1,c+1+n);
	if(n&1) m=c[(n+1)/2];
	else m=(c[n/2]+c[n/2+1])/2;
	for(int i=1;i<=n;i++)
		ans+=abs(c[i]-m);
	printf("%lld",ans);
	return 0;
}

有一种输给了绿题的耻辱感,所以遇到这种数据范围开小了被误导的题有什么解决办法吗?


http://www.kler.cn/news/304953.html

相关文章:

  • 深度神经网络
  • Django REST framework 实现缓存机制以优化性能
  • C/S架构和B/S架构哪个更好用一些?
  • Spire.PDF for .NET【文档操作】演示:创比较 PDF 文档
  • 【C++】——string(模拟实现)
  • 基于 ROS 的Terraform托管服务轻松部署Stable Diffusion
  • 逆向学习系列(三)adb的使用
  • 打造智能数据分析平台:基于 Flask 的数据处理与模型精度验证系统
  • 使用 Docker 进入容器并运行命令的详细指南
  • GANs-生成对抗网络
  • intellij idea创建java项目
  • MinGW探源:名称背后的故事、发音指南与历史沿革
  • (179)时序收敛--->(29)时序收敛二九
  • linux -L4.linux 暂停和启动进程
  • VUE工程中axios基本使用
  • SharePoint 创建本地 Web 部件 workbench 报错解决
  • quartus pin 分配(三)
  • Kubernetes (k8s)v1.27.1版本安装步骤
  • Jupyter Notebook | 安装 rise 插件后显示幻灯片失败
  • 【C#生态园】完整解读C#音频处理库:功能、安装配置和使用场景一网打尽
  • JavaScript 基础 - 第16天_AJAX入门
  • 什么是设计模式,要掌握那些知识
  • 若依笔记(六):前后端token鉴权体系
  • JUnit 5 详解
  • Redisson实现分布式锁
  • conda根据配置文件自动切换环境-----模仿 rvm 的 .ruby-version机制
  • 新能源汽车安全问题如何解决?细看“保护罩”连接器的守护使命
  • 【华为OD流程】性格测试选项+注意事项
  • 机器学习和深度学习区别
  • Python3 SMTP发送邮件