题目链接

戳我

\(Solution\)

先将所有棋子移动到最近的目标点上

我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j)\)上有多少个棋子,\(ans\)为答案

如果为正表示从左边移到右边

如果为负表示从右边移到左边

我们考虑怎么维护这个东西

我们考虑一下两种大情况:

  1. 这个位置上原本有值

    那么我们只要将\(ans+(f[i][j]-1)\)即可

  2. 这个位置本来没有值

    我们考虑三种情况,我们以一行为例,其余的一行同理

    • \(ans1\)大于0,那么我们只需要将\(ans1--\)
    • \(ans1<0\)&&\(ans2>0\) 我们将\(ans2--,ans+1\)表示从下面移上来(但是对于第一行的时候要注意一个事,下面会讲)
    • 其余情况 \(ans1--\),表示从右边要借一个过来。

    上面留了一个坑,对于第一行的时候后,在下面一行往上移的时候我们还要判断下面一行的情况。如果下面一行\(ans2==1,f[i][2]==0\)那么就不能移,因为要留着自己用

然后处理完之后会得到这一行的\(ans1\)和\(ans2\)于是我们在判断一下\(ans1\)和\(ans2\)是否为一正一负.

如果是则把绝对值小的那个移到另一行去,答案加上这个绝对值。

每次弄完之后,答案加上\(abs(ans1)+abs(ans)\)表示往后面移这些硬币

\(Code\)

#include<bits/stdc++.h>
#define int long long
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
const int N=1e6+10;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
int X[N],Y[N],n,ans,flag1,flag2,ans1,ans2;
int f[N][3];
void solve(int x,int y){
int nowx=x,nowy=y;
if(x<=n&&x>=1&&y<=2&&y>=1) {f[x][y]++;return ;}
if(x>n) x=n;
if(x<1) x=1;
if(y>2) y=2;
if(y<1) y=1;
f[x][y]++,ans+=abs(nowx-x)+abs(nowy-y);
}
main(){
n=read();
for(int i=1;i<=2*n;i++)
X[i]=read(),Y[i]=read(),solve(X[i],Y[i]);
for(int i=1;i<=n;i++){
if(f[i][1]>1) ans1+=f[i][1]-1;
if(f[i][2]>1) ans2+=f[i][2]-1;
if(f[i][1]==0){
if(ans1>0) ans1--;
else if(ans2>0&&(ans2>1||(ans2==1&&f[i][2]))) ans2--,ans+=1;
else ans1--;
}
if(f[i][2]==0){
if(ans2>0) ans2--;
else if(ans1>0) ans1--,ans+=1;
else ans2--;
}
if(ans1<0&&ans2>0) {
if(abs(ans1)<abs(ans2))
ans2=ans2+ans1,ans+=abs(ans1),ans1=0;
else ans1=ans2+ans1,ans+=abs(ans2),ans2=0;
}
if(ans2<0&&ans1>0) {
if(abs(ans1)<abs(ans2))
ans2=ans2+ans1,ans+=abs(ans1),ans1=0;
else ans1=ans2+ans1,ans+=abs(ans2),ans2=0;
}
ans+=abs(ans1)+abs(ans2);
}
cout<<ans;
return 0;
}

「JOI 2019 Final」 硬币收藏的更多相关文章

  1. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  2. loj 3014「JOI 2019 Final」独特的城市

    loj 我本来是直接口胡了一个意思一样的做法的,但是因为觉得有点假+实现要用并查集(?)就卡了好一会儿... 对于一个点\(x\)来说,独特的点一定在它的最长链上,如果有独特的点不在最长链上,那么最长 ...

  3. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  4. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  5. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  6. 「JOI 2014 Final」飞天鼠

    「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...

  7. 「JOI 2015 Final」城墙

    「JOI 2015 Final」城墙 复杂度默认\(m=n\) 暴力 对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向 ...

  8. 「JOI 2015 Final」舞会

    「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主 ...

  9. 「JOI 2015 Final」分蛋糕 2

    「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len ...

随机推荐

  1. C++ const关键字以及static关键字

    const可以用来修饰类中的成员函数以及成员变量以及类的对象 1.const修饰成员函数: 该函数是只读函数,不允许修改任何成员变量,但是可以使用类中的任何成员变量: 不允许修改任何非static的类 ...

  2. warning C4819 的解决方法

    编译VC++程序的时候出现如下提示警告: warning C4819: The file contains a character that cannot be represented in the ...

  3. MySQL之常见错误

    1)mysql导入较大sql文件,出现MySQL server has gone away ERROR (HY000) at line in file: 'E:\xampp\htdocs\SsCpc\ ...

  4. vue移动端出现遮罩层时在遮罩层滑动时禁止遮罩层下方页面滑动

    h5页面 点击出现弹框时 在遮罩层上面滑动时 下方的页面会出现滑动现象 解决方法 我知道的有以下两种 在遮罩层标签上添加@touchmove.prevent 把遮罩层显示时把下方的父盒子css设置为固 ...

  5. 获取指定开始行数$start,跨度$limit的文件内容

    // 获取指定开始行数$page,跨度$step的文件内容 function getLine($file_name, $start, $limit) { $f = new SplFileObject( ...

  6. delphi FMX APP程序图标,闪屏,程序名

  7. Java学习笔记【九、集合框架】

    集合框架设计的目标: 高性能. 允许不同类型的集合,以类似的方式工作,有互操作性. 对一个集合的扩展和适应必须简单. 集合框架包含: 接口:代表集合的抽象数据类型. 实现(类):具体实现(ArrayL ...

  8. PyCharm 创建指定版本的 Django (超详细图解)

    最近在学习胡阳老师(the5fire)的<Django企业级开发实战>,想要使用pycharm创建django项目时,在使用virtualenv创建虚拟环境后,在pycharm内,无论如何 ...

  9. 解决Zabbix某台主机突然频繁告警"Zabbix agent on xxxxxx is unreachable for x minutes"

    一.某台主机突然某一天频繁告警zabbix agent不可达 查看zabbix agent日志没有发现异常 二.查看zabbix server日志发现这台主机的日志有大量报错信息"first ...

  10. java-面试题为什么redis这么快

    文章:为什么说Redis是单线程的以及Redis为什么这么快! 文章比较详细,有些细节可能需要注意. 1,比如CPU不是redis的瓶颈 2,随着连接数的增加,并发会降低等.