题解 [JOI 2019 Final] 硬币收藏
解析
首先题目可以理解为把一些点放进一个框里,每个格子只能放一个.
那么显然你可以先把这个点移到框里离它最近的格子里,
(这个时候格子里可以放很多个)
然后再在框里乱跑移动.
那么我们先考虑只有一行,
这时硬币只能左右移动.
于是可以开一个数组\(f[i]\)记录这个格子里有几个硬币.
但不同的一点是,桶的初始值为\(-1\).
也就是说放了一个硬币的格子的值是\(0\).
然后再从\(1\)到\(n\)遍历,
如果\(f[i]<0\)说明它需要右边的硬币移过来,
而\(f[i]>0\)就说明它这里的硬币要移到右边去.
然后\(f[i+1]+=f[i]\),表示把它的需求传到下一个,
并且\(ans+=f[i]\),因为有\(f[i]\)个硬币移动了一个格子.
(上面这一段最好一起看完了再理解)
然后有两行的话,就只是多了一个上下移动,
因为上下移动不会比左右动差.
于是先考虑能不能上下移动,再转移就行了.
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
#define int long long
#define pii pair<int,int>
#define fi first
#define sc second
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
}
const int N=1000005;
struct node{int x,y;}a[N];
int n,tot,ans;
int f[N][3];
signed main(){
n=read();
for(int i=1;i<=(n<<1);i++) a[i].x=read(),a[i].y=read();
for(int i=1;i<=n;i++) f[i][1]=f[i][2]=-1;
for(int i=1;i<=(n<<1);i++){
int xx=max((int)1,min(a[i].x,n)),yy=max((int)1,min(a[i].y,(int)2));
ans+=abs(xx-a[i].x)+abs(yy-a[i].y);
f[xx][yy]++;
}
for(int i=1;i<=n;i++){
if(f[i][1]>0&&f[i][2]<0){
int ret=min(abs(f[i][1]),abs(f[i][2]));
f[i][1]-=ret;f[i][2]+=ret;
ans+=ret;
}
else if(f[i][1]<0&&f[i][2]>0){
int ret=min(abs(f[i][1]),abs(f[i][2]));
f[i][2]-=ret;f[i][1]+=ret;
ans+=ret;
}
ans+=abs(f[i][1]+f[i][2]);
f[i+1][1]+=f[i][1];f[i+1][2]+=f[i][2];
}
printf("%lld\n",ans);
return 0;
}
题解 [JOI 2019 Final] 硬币收藏的更多相关文章
- 题解 [JOI 2019 Final] 独特的城市
题面 解析 首先有一个结论, 对一个点\(x\)有贡献的城市 肯定在它到离它较远的直径的端点的链上. 假设离它较远的端点是\(S\), 如果有一个点\(u\)不在\(x\)到\(S\)的链上, 却对\ ...
- JOI 2019 Final合集
JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI\),使得\(O\)在\(J\)同行的 ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- 「JOI 2019 Final」 硬币收藏
题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...
- loj 3014「JOI 2019 Final」独特的城市
loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...
- 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...
- JOI 2018 Final 题解
题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
随机推荐
- IP地址 子网掩码 网络地址 主机地址 广播地址
1.一定要明白各自的概念分别表示什么 IP地址:IP地址是用来识别网络上的设备,因此,IP地址是由网络地址与主机地址两部分所组成. 子网掩码:子网掩码不能单独存在,它必须结合IP地址一起使用.子网掩码 ...
- Win10 鼠标右键新建菜单添加自定义文件
1. 引言 在鼠标右键(右单机)新建菜单中添加自定义文件,例如:写字板,markdown等. 效果图: 2. 操作步骤(以Win10为例) 1. win+R输入regedit进入注册表 2. 这里以添 ...
- 正则与re模块
一.正则表达式 在线测试工具 http://tool.chinaz.com/regex/ 1.字符组 在同一个位置可能出现的各种字符组成一个字符组,在正则表达中用[ ]表示 一个正则就是一条匹 ...
- js — 字符串
目录 1. 拼接字符串 2. 获取字符的方法 3. 字符串操作方法(切片) 4. 字符串位置方法 - 索引 5. trim()方法 6. 字符串大小写转换方法 字符串 typeof 用于校验当前变量的 ...
- 模块 json 和 pickle
目录 序列化 json 和 pickle 模块 序列化 序列:字符串 序列化:将其它数据类型转换成字符串的过程. 反序列化:字符串转成其它数据类型. 序列化的目的 1:以某种存储形式使用自定义对象持久 ...
- python中列表之间求差集、交集、并集
求两个列表的交集.并集.差集 def diff(listA, listB): # 求交集的两种方式 retA = [i for i in listA if i in listB] retB = lis ...
- params关键字应用
params 是C#中的可变参数, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候. 关于参数数组,需掌握以下几点. (1)在方法声明中的 params 关键字之后不允 ...
- myeclipse 出现换行符和空格符 解决方案 换行出现乱码
请参看百度经验 https://jingyan.baidu.com/article/acf728fd2639e4f8e510a399.html myeclipse 2014 自定义视图Customiz ...
- 前端开发 Vue -2npm
npm介绍 说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) 使用npm安装插件:命令提示符执行npm instal ...
- 【前端】安装wampserver提示丢失MSVCR100.dll的解决方法
先装Visual C++,再装wampserver 下载的时候请注意选择对应的32bit还是64bit的.然后安装. 再安装wamp