首页 > 其他分享 >[ARC114D] Moving Pieces on Line 题解

[ARC114D] Moving Pieces on Line 题解

时间:2024-02-04 15:33:21浏览次数:31  
标签:ch 匹配 int 题解 len read Moving Line define

题目链接

点击打开链接

题目解法

有点牛的题,前面的转化感觉很妙

首先一个显然的性质是:一个棋子不可能走回头路,不然前面的路就白走了

下面是最妙的一步:我们令 \(st_i\) 为 \(i-1\to i\) 和 \(i\to i+1\) 的颜色是否相同,那么问题可以转化成:选择 \(\{p_i\}\),一开始所有点颜色为 \(0\),将 \(a_i\) 和 \(p_i\) 反转颜色,最后使 \(\{t_i\}\) 的颜色为 \(1\) 的最小 \(\sum\limits_{i=1}^n |a_i-p_i|\)

这个问题就好入手了
继续简化问题
我们把 \(\{a_i\}\) 和 \(\{t_i\}\) 集合合在一起,把出现次数为奇数的位置提出来,令其为 \(\{b_1,b_2,...,b_m\}\)
考虑如何把这个东西和原问题对应?我们要寻找一个完美匹配,匹配方式为:要么 \(a_i\) 和 \(a_j\) 匹配,要么 \(a_i\) 和 \(b_j\) 匹配,权值为匹配双方的差的绝对值之和

  • \(n<m\) 显然无解
  • \(n\ge m\)
    默认 \(a,b\) 从小到大排好序
    考虑一个贪心的思路是:如果 \(a\) 中的两个匹配,那么只可能是相邻的,然后 \(a\) 中未匹配的从小到大依次和 \(b\) 中的匹配
    不难得到 \(nm\) 的 \(dp\)

时间复杂度 \(O(nm)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=5010;
int n,k,a[N],b[N],rig[N];LL f[N][N];
map<int,bool> mp;
int main(){
    n=read(),k=read();
    F(i,1,n) a[i]=read(),mp[a[i]]^=1;
    F(i,1,k) b[i]=read(),mp[b[i]]^=1;
    int len=0;
    for(auto it:mp) if(it.second){
        if(len+1>=N){ puts("-1");exit(0);}
        rig[++len]=it.first;
    }
    if(len>n||((n-len)&1)){ puts("-1");exit(0);}
    sort(a+1,a+n+1);
    ms(f,0x3f);
    f[0][0]=0;
    F(i,1,n) F(j,0,len){
        if(i>=2) chkmin(f[i][j],f[i-2][j]+abs(a[i]-a[i-1]));
        if(j) chkmin(f[i][j],f[i-1][j-1]+abs(a[i]-rig[j]));
    }
    printf("%lld\n",f[n][len]);
    return 0;
}

标签:ch,匹配,int,题解,len,read,Moving,Line,define
From: https://www.cnblogs.com/Farmer-djx/p/18006335

相关文章

  • ABC339 F Product Equality 题解
    QuestionABC339FProductEquality给出一个序列\(A_1,A_2,\cdots,A_N\)计算数对\((i,j,k)\)满足\(A_i\timesA_j=A_k\)的个数\(A_i\le10^{1000}\)Solution思考\(A_i\)比较小的情况如果\(A_i\le1e9\)的,暴力枚举\(i,j\)然后用\(map\)查找\(A_i\timesA_j......
  • kekingcn/file-online-preview服务打包arm架构镜像
    1.gitte地址https://gitee.com/kekingcn/file-online-preview?_from=gitee_search 2.基础镜像打包FROMubuntu:20.04MAINTAINERchenjh"[email protected]"#内置一些常用的中文字体,避免普遍性乱码COPYfonts/*/usr/share/fonts/chinese/RUNapt-getclean&&apt-ge......
  • gitlab 502问题解决
    问题现象: Whoops,GitLabistakingtoomuchtimetorespond.Tryrefreshingthepage,orgoingbackandattemptingtheactionagain.PleasecontactyourGitLabadministratorifthisproblempersists. 问题定位分析:一、查看系统资源使用情况磁盘满了g......
  • Idea Jrebel 报错:Cannot reactivate,offline seat in use
    一、问题描述在使用ideaJrebel续期的时候,修改idea激活服务器地址时,遇到报错:Cannotreactivate,offlineseatinuse.ClickWorkonlineinJRebelconfigurationtoreturnofflineseat...二、问题解决找到idea配置文件:jrebel.properties,修改文件属性:rebel.license.......
  • 如何绕过Python readline的Tab-补全
    在Python中,readline模块提供了一个交互式的命令行输入接口,其中的Tab补全是指用户在输入时按下Tab键,系统会自动尝试完成当前输入的命令或路径。Tab补全的主要功能是帮助用户更快速、更准确地输入命令或路径,尤其是当有很多可能的选项时。下面我将用详细的步骤来说明Tab补全......
  • Linux服务器升级GLIBC失败导致shell不可用的问题解决经历
    转自https://blog.csdn.net/u010549608/article/details/126281354?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170696599716800182728626%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170696599716800182728626&biz_i......
  • ABC339_g Smaller Sum 题解
    题目链接:Atcoder或者洛谷比价朴素的题,首先有暴力的想法就是树套树或者分块。这两种就不再赘述,这里来正式提提主xi树(应该不能打出来这玩意)的本质而不再停留在板题找第\(k\)大上。对于可差性问题和传统问题不同,我们对于可差性问题往往都有更好的优化方案。例如对于树类问......
  • AcWing 5466. 随机排列 题解
    讲解都在代码里了#include<bits/stdc++.h>//可以发现不管n怎么取,3n和7n+1都是一个奇数一个偶数//那么那么我们用最多n-1次交换将数组复原看一看用了奇数次还是偶数次就可以看出来了//这种交换方式常见于基础课内容,是两个数组互为双向usingnamespacestd;constintN=1e......
  • ABC339 题解
    AK了。A-TLD给出一个字符串\(s\),输出最后一个.后面的内容。\(|s|\le100\)。\(\text{2sec/1024MB}\)。按照题意模拟即可,时空复杂度均为\(\mathcal{O}(|s|)\)。ACCodeB-Langton'sTakahashi给出\(H\timesW\)的网格。初始你在\((1,1)\),方向......
  • ABC339 题解(A~G)
    A从后向前找到第一个.就行了。B按照题意模拟,设当前位置\(x,y\)移动方向\(dx,dy\)。那么下一步为\((x+dx,y+dy)\)设新的移动方向为\(dx',dy'\)如果顺时针旋转,则有\(dy'\gets-dx,dx'\getsdy\);如果逆时针,则有\(dx'\gets-dy,dy'\getsdx\)。C鉴定为除A以外......