AT题面

简要题意

有一个红色的数轴,相邻两个整点之间连有一条边,所有边初始为红色。数轴上有 \(n\) 个棋子,将一个棋子从 \(a\) 位置移到 \(b\) 位置,可以将 \((a,b)\) 之间红边变为蓝边,蓝边变为红边。给定 \(k-1\) 条线段,问能否进行若干次操作,使得当 \(i\) 是奇数,第 \(i\) 条线段是蓝色,当 \(i\) 是偶数,第 \(i\) 条线段是红色。

分析

容易发现一个棋子最多朝一个方向走一定路程,不然反复走的那一段肯定多余。令 \(x_i\) 表示点 \(i\) 左右两条线段是否相同,那么一个棋子移动就相当于一个区间异或操作,将其差分,就变成了起始点异或 \(1\),终止点异或 \(1\)。因为线段的端点均是 \(x_i=1\),所以只有被异或奇数次的才有可能是终止点,假设这样的点有 \(m\) 个。

根据上面的分析,可以知道 \(m\) 一定小于等于 \(n\)。

对于 \(m\le n\) 的情况,将棋子的位置看作白点,将异或奇数次的点看作黑点。首先黑白点能互相匹配,代价为 \(|a_i-b_j|\);相邻的白白点也可以互相匹配,代价为 \(a_i-a_{i-1}\)。令 \(f_{i,j}\) 表示 \(i\) 个白点和 \(j\) 个黑点匹配的代价,直接dp,答案为 \(f_{n,m}\)。

Code

点击查看代码
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define pdi pair<double,int>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define eps 1e-9
using namespace std;
namespace IO{
template<typename T>
inline void read(T &x){
x=0;
int f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
x=(f==1?x:-x);
}
template<typename T>
inline void write(T x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10){
write(x/10);
}
putchar(x%10+'0');
}
template<typename T>
inline void write_endl(T x){
write(x);
putchar('\n');
}
template<typename T>
inline void write_space(T x){
write(x);
putchar(' ');
}
}
using namespace IO;
const int N=5e3+10;
int n,m,a[N],b[N<<1],c[N<<1],cnt;
ll f[N][N];
signed main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
read(n),read(m);
for(int i=1;i<=n;i++){
read(a[i]);
b[i]=a[i];
}
for(int i=1;i<=m;i++){
read(b[i+n]);
}
m+=n;
sort(a+1,a+n+1);
sort(b+1,b+m+1);
for(int i=1,j;i<=m;i=j){
for(j=i;j<=m;j++){
if(b[j]!=b[i]){
break;
}
}
if((j-i)%2){
c[++cnt]=b[i];
}
}
if(n<cnt){
puts("-1");
return 0;
}
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=cnt;j++){
if(j)f[i][j]=f[i-1][j-1]+abs(a[i]-c[j]);
if(i>=2){
f[i][j]=min(f[i][j],f[i-2][j]+a[i]-a[i-1]);
}
}
}
write_endl(f[n][cnt]);
return 0;
}

[ARC114D] Moving Pieces on Line 解题报告的更多相关文章

  1. 【LeetCode】1033. Moving Stones Until Consecutive 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 脑筋急转弯 日期 题目地址:https://leet ...

  2. 【LeetCode】149. Max Points on a Line 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+最大公约数 日期 题目地址:https://l ...

  3. LeetCode: Max Points on a Line 解题报告

    Max Points on a Line Given n points on a 2D plane, find the maximum number of points that lie on the ...

  4. codeforces A. Dima and Continuous Line 解题报告

    题目链接:http://codeforces.com/problemset/problem/358/A 题目意思:在横坐标上给出n个不同的点,需要把前一个点跟后一个点(这两个点的顺序是紧挨着的)用一个 ...

  5. codeforces A. Cinema Line 解题报告

    题目链接:http://codeforces.com/problemset/problem/349/A 题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这 ...

  6. poj 3617 Best Cow Line 解题报告

    题目链接:http://poj.org/problem?id=3617 题目意思:给出一条长度为n的字符串S,目标是要构造一条字典序尽量小,长度为n的字符串T.构造的规则是,如果S的头部的字母 < ...

  7. codeforces B. Shower Line 解题报告

    题目链接:http://codeforces.com/contest/431/problem/B 题目意思:给出5 * 5 的矩阵.从这个矩阵中选出合理的安排次序,使得happiness之和最大.当第 ...

  8. 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)

    官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  10. ACM: Just a Hook 解题报告 -线段树

    E - Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

随机推荐

  1. 统一返回对象Result

    统一返回对象Result 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致.轻松. 一般情况下,统一返回数据格式 ...

  2. RTC月度小报6月丨编程挑战赛圆满收官;声网上市1周年回顾...

    本月亮点速览 产品与技术: 声网Agora 实时音视频服务正式上线 HTC VIVE Sync App,支持非 VR 用户 「灵动课堂」发布 1.1.2 版本 「互动直播」6 月共发布两个版,最新版本 ...

  3. 新版TinyCore Linux系统安装

    1.设置软件仓库源echo "https://mirrors.163.com/tinycorelinux">/opt/tcemirror 2.安装启动加载器及其依赖tce-l ...

  4. 发布新版博客备份功能:生成 sqlite 数据库文件,vscode 插件可查看

    大家好,最近我们重新开发了园子的博客备份功能,今天发布第一个预览版,欢迎大家试用. 点击博客后台侧边栏的博客备份进入新版博客备份: 点击创建备份按钮创建博客备份任务(目前每天只能创建一次备份),待备份 ...

  5. Mac连接Win的方法

    前言 我们都知道,Mac和Win还是非常不一样的,作为Macdows双修选手,我今天给大家介绍一些从Mac连接Win的方法. Win的RDP 由于Win默认未安装ssh,我们最常使用的连接方式则是使用 ...

  6. VS Code多语言笔记本扩展插件 Polyglot Notebooks

    早在2022年12月12日,微软就发布了VS Code的多语言笔记本扩展插件 Polyglot Notebooks,所使用的引擎为. NET Interactive,目前支持包括C#.F#.Power ...

  7. WordPress回复/评论本文可见

    给WordPress添加一个实用的小功能,那就是回复可见,评论文章才能见到隐藏内容. 在主题目录下找到functions.php文件,在合适位置添加下方的代码: // 回复可见 function re ...

  8. IconJar - Mac 上的一款多功能图标素材管理工具

    IconJar 是一个多功能的图标管理工具,由世界各地的设计师和开发人员使用.在一个应用程序中搜索.组织.预览和检索图标,而不是创建大量的文件夹来存储你的收藏.这款应用针对黑暗模式进行了优化,并支持S ...

  9. Sokit(TCP/UDP调试工具)

    下载:http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试(调试)工具,它主要可以用于接收和发送TCP/ ...

  10. 解决ubuntu 20.04、22.04 即新版本 fcitx 无法使用的问题

    前提 已在系统设置中将fcitx设置为默认 fcitx开机自启 配置的过程不在本文讨论范围之内 开机自启可通过安装gnome-tweaks配置实现 问题分析流程 手动启动fcitx时提示设置XMODI ...