【JZOJ5489】海明距离

2023-10-25 02:48
文章标签 距离 海明 jzoj5489

本文主要是介绍【JZOJ5489】海明距离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

设有一长度为n的初始每个位置均为0的序列A。再给定一个长度为n的01序列B。
有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变。
现在你需要最小化A,B的海明距离。即最小化对应数值不同的位置数目。

Solution

这题我们可以从暴力入手。将区间按左端点排序后,每次枚举一个区间选不选,加上他的贡献,分与前面的区间相交和不交两种情况。

仔细分析一下暴力,我们可以发现暴力实际上只有两维状态:当前做到的区间 i ,和上一个区间覆盖的最后位置j。有这两个我们就可以设状态 fi,j 表示最小海明距离,那么对于一个区间 [li,ri] ,我们可以这样转移( si 表示B序列 i 位置以及之前有多少个1):
fi,ri=min(fi1,j+rimax(j,li1)2(srismax(j,li1)))(j<ri)
fi,j=fi1,j(jri)

然后很明显,第一维可以去掉。

把式子拆一拆发现可以用数据结构维护。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;++i)
#define fd(i,j,k) for(int i=j;i>=k;--i)
#define N 200100
#define inf 1010580540
using namespace std;
struct node{int l,r;
}b[N];
int a[N],s[N],w[N],n;
int f[N];
struct tree{int f,sf;
}tr[N*4];
bool cmp(node x,node y){return x.l<y.l || (x.l==y.l && x.r<y.r);
}
int min(int x,int y){return x<y?x:y;
}
void update(int v){tr[v].f=min(tr[v*2].f,tr[v*2+1].f);tr[v].sf=min(tr[v*2].sf,tr[v*2+1].sf);
}
void build(int v,int l,int r){if(l==r){tr[v].f=f[l],tr[v].sf=2*s[l]-l+f[l];return;}int mid=(l+r)/2;build(v*2,l,mid),build(v*2+1,mid+1,r);update(v);
}
void insert(int v,int l,int r,int x){if(l==r){if(tr[v].f>f[l]){tr[v].f=f[l],tr[v].sf=f[l]+2*s[l]-l;}return;}int mid=(l+r)/2;x<=mid?insert(v*2,l,mid,x):insert(v*2+1,mid+1,r,x);update(v);
}
int find(int v,int l,int r,int x,int y,int t){if(x>y) return inf;if(l==x && r==y) return !t?tr[v].f:tr[v].sf;int mid=(l+r)/2;if(y<=mid) return find(v*2,l,mid,x,y,t);else if(x>mid) return find(v*2+1,mid+1,r,x,y,t);else return min(find(v*2,l,mid,x,mid,t),find(v*2+1,mid+1,r,mid+1,y,t));
}
int main()
{int m;scanf("%d",&n);fo(i,1,n) scanf("%d",&a[i]),s[i]=s[i-1]+a[i];scanf("%d",&m);memset(f,60,sizeof(f));fo(i,1,m) scanf("%d %d",&b[i].l,&b[i].r);sort(b+1,b+m+1,cmp);fo(i,1,m) w[i]=b[i].r-b[i].l+1-2*(s[b[i].r]-s[b[i].l-1]);f[0]=s[n];build(1,0,n);fo(i,1,m){f[b[i].r]=min(f[b[i].r],min(find(1,0,n,0,b[i].l-1,0)+w[i],find(1,0,n,b[i].l,b[i].r-1,1)+b[i].r-2*s[b[i].r]));insert(1,0,n,b[i].r);}int ans=s[n];fo(i,0,n) ans=min(ans,f[i]);printf("%d",ans);
}

这篇关于【JZOJ5489】海明距离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/279523

相关文章

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

模拟退火求n个点到某点距离和最短

/*找出一个点使得这个店到n个点的最长距离最短,即求最小覆盖圆的半径用一个点往各个方向扩展,如果结果更优,则继续以当前步长扩展,否则缩小步长*/#include<stdio.h>#include<math.h>#include<string.h>const double pi = acos(-1.0);struct point {double x,y;}p[1010];int

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

SimD:基于相似度距离的小目标检测标签分配

摘要 https://arxiv.org/pdf/2407.02394 由于物体尺寸有限且信息不足,小物体检测正成为计算机视觉领域最具挑战性的任务之一。标签分配策略是影响物体检测精度的关键因素。尽管已经存在一些针对小物体的有效标签分配策略,但大多数策略都集中在降低对边界框的敏感性以增加正样本数量上,并且需要设置一些固定的超参数。然而,更多的正样本并不一定会带来更好的检测结果,事实上,过多的正样本

Matlab)实现HSV非等间隔量化--相似判断:欧式距离--输出图片-

%************************************************************************** %                                 图像检索——提取颜色特征 %HSV空间颜色直方图(将RGB空间转化为HS

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目,目的就一个,方法千千万,通向终点的方式有很多种,没有谁与谁,我们都是为了成为更好的自己。 2. 正文 2.1 问题 题目描述: 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。 输入格式:

mysql5.6根据经纬度查询距离二

在MySQL 5.6中,您可以使用Haversine公式来根据经纬度查询距离。以下是一个示例SQL查询,它计算出所有点与给定点(经度lon和纬度lat)的距离,并按距离排序: SELECT id, (2 * 6378.137 * ASIN(SQRT(POW( SIN( PI( ) * ( $lng- `long` ) / 360 ), 2 ) + COS( PI( ) * $lat / 180

像素间的关系(邻接、连通、区域、边界、距离定义)

文章目录 像素的相邻像素4邻域D邻域8邻域 邻接、连通、区域和边界邻接类型连通区域边界 距离测度欧氏距离城市街区距离(city-block distance)棋盘距离(chessboard distance) 参考 像素的相邻像素 4邻域 坐标 ( x , y ) (x,y) (x,y)处的像素 p p p有2个水平的相邻像素和2个垂直的相邻像素,它们的坐标是: ( x

【go语言计算两个经纬度距离】根据经纬度计算两点之间距离

一、需求分析: 输入两个经纬度,计算它们之间的距离 lat1,lng1 := 32.060255,118.796877lat2,lng2 := 39.904211,116.407395 二、计算公式 //C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)