首页 > 其他分享 >E. Beautiful Array(题解)

E. Beautiful Array(题解)

时间:2025-01-07 12:21:45浏览次数:6  
标签:Beautiful 取模 int 题解 xmmm a1 a2 Array t%

原题链接:

https://codeforces.com/problemset/problem/1986/E

思路:

排序,取模, 思维

关于操作:ai=ai+k;
若要使a1+m1*k==a2+m2*k;
则当a1, a2满足a1%k==a2%k,a1,a2可以满足a1+m1*k==a2+m2*k;并在需要(|a1-a2|)/k次操作。

将a数组取模后,用vector分别储存, a1和a2相差越小, 需要的次数越小,所以用一个sort排序。

取模后相同的数的个数可以全为偶数, 也可以只有一个奇数。其他则不满足。

偶数直接处理, 奇数需要枚举要放在中间的那个数, 可以看函数mark();

代码:

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int xmmm=2e5+10;
int a[xmmm];
vector<int>s[xmmm];
int head[xmmm];
int p1[xmmm], p2[xmmm];
int s1[xmmm], s2[xmmm];
int mark(int x){
    for(int i=0;i<=head[x];i++)p1[i]=p2[i]=0;
    for(int i=0, j=1;i<head[x]-1;i+=2, j++)p1[j]=s[x][i+1]-s[x][i];
    for(int i=1, j=1;i<head[x];i+=2, j++)p2[j]=s[x][i+1]-s[x][i];
    for(int i=1;i<=head[x]/2;i++){
        s1[i]=s1[i-1]+p1[i];
        s2[i]=s2[i-1]+p2[i];
    }
    int mi=2e10;
    for(int i=0;i<head[x];i+=2){
        int ss=s1[i/2]+(s2[head[x]/2]-s2[i/2]);
        mi=min(mi, ss);
    }
    return mi;
}
void in(int t){
    for(int i=0;i<=t;i++)s[i].clear();
}
void solve(){
    int cnt=0;
    map<int, int>mp;
    int n, k;cin>>n>>k;
    for(int i=1;i<=n;i++){
        int t;cin>>t;
        if(mp[t%k]==0)mp[t%k]=++cnt;
        s[mp[t%k]].push_back(t);
    }
    int sum=0, num=0;
    for(int i=1;i<=cnt;i++){
        head[i]=s[i].size();
        if(head[i]%2)num++;
    }
    if(num>1){
        cout<<-1<<'\n';
        in(cnt);
        return ;
    }
    for(int i=1;i<=cnt;i++){
        sort(s[i].begin(), s[i].end());
        if(head[i]%2==0){
            for(int j=1;j<head[i];j+=2)sum+=(s[i][j]-s[i][j-1])/k;
        }
        else if(head[i]>1)sum+=mark(i)/k;

    }
    cout<<sum<<'\n';
    in(cnt);
}
signed main()
{
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

总结:

sort常用
写题最大的魅力就是能不断AC和一直WA
欢迎留言!
image

标签:Beautiful,取模,int,题解,xmmm,a1,a2,Array,t%
From: https://www.cnblogs.com/1747176348mi/p/18657397

相关文章

  • 题解:CF2043C Sums on Segments
    题意给你一个长度为\(n\)的数组\(a\),满足\(a\)中有且仅有一个不为\(1\)也不为\(-1\)的数(以下简称特殊的值),剩余的数都是\(1\)或\(-1\)。求所有可能的子区间的和的值(下文简称答案)。从小到大一次输出每一个值,每个值只输出一遍。题解首先,我们发现,如果把那个特殊的值考......
  • 题解:CF2057B Gorilla and the Exam
    CF2057BGorillaandtheExam思路不难发现其实每次操作就是把数组\(a\)内所有值为\(y\)的数都删除掉(\(y\)为数组\(a\)中的莫一个值)。所以我们需要把尽可能多的数都变成原来数组里出现次数最多的数(从出现数量最少的开始,这样能使得消失的数值种类最大化)。首先想到使用数组......
  • 题解:P11507 [ROIR 2017 Day 1] 计算器
    P11507[ROIR2017Day1]计算器思路简单的动态规划。\(dp_{i,j,k}\)表示使用了\(i\)次按钮A,\(j\)次按钮B和\(k\)次按钮C。转移式:\[\begin{cases}dp_{i+1,j,k}=\min(dp_{i+1,j,k},\lfloordp_{i,j,k}\div2\rfloor);\\dp_{i,j+1,k}=\min(dp_{i,j+1,k},\lfloo......
  • QOJ964. Excluded Min 题解
    QOJ原题链接简要题意设\(S\)为一个可重非负整数集合,假设\(x\)为\(S\)中的一个出现次数\(\ge2\)的元素,你可以将\(x\)改成\(x+1\)或\(x-1\)。定义\(f(S)\)表示对\(S\)进行上述操作任意次所能达到的最大\(\operatorname{mex}\)。给定一个长度为\(n\)的......
  • [POJ3237] 树的维护 题解
    一眼树链剖分或\(LCT\),由于在学后者所以就写了。取反操作相当于把\(min,max\)取反后交换,所以要维护\(min,max,val\)。时间复杂度\(O(m\logn)\)。#include<bits/stdc++.h>#definefa(x)lct[x].fa#definefl(x)lct[x].fl#definemx(x)lct[x].mx#definemn(x)lct[x]......
  • 复旦大学2024--2025学年第一学期(24级)高等代数I期末考试第七大题解答
    七、(10分) 设$V$是数域$\mathbb{K}$上的$n$维线性空间,$\varphi,\psi$是$V$上的幂等线性变换, 满足$\varphi\psi=\psi$且$\mathrm{Ker}\varphi$是$\psi$-不变子空间.证明:(1)$\mathrm{r}(\psi)\leq\mathrm{r}(\varphi)$;(2)若$\mathrm{r}(\psi)=\mathrm{......
  • 复旦大学2024--2025学年第一学期(24级)高等代数I期末考试第八大题解答
    八、(10分) 设$A,B$为$n$阶实矩阵,满足$A^2+B^2=AB$且$AB-BA$为非异阵, 求证:$n$是3的倍数且$|BA-AB|>0$.证明 设$\omega=-\dfrac{1}{2}+\dfrac{\sqrt{3}}{2}\mathrm{i}$,则$\omega^2=\overline{\omega}=-\dfrac{1}{2}-\dfrac{\sqrt{3}}{2}\mathrm{i}$,于......
  • Docker多阶段构建详解及问题解决
    在Docker的构建过程中,多阶段构建是一种非常强大的功能,它允许我们在一个Dockerfile中使用多个阶段来构建镜像,从而大大优化最终镜像的大小和构建过程。本文将详细介绍Docker多阶段构建的基本用法,并针对在使用该功能时可能遇到的问题提供解决方案。Docker多阶段构建基础多阶......
  • ArrayList源码解析-JDK18
    引言ArrayList在JDK1.7和1.8中的差距并不大,主要差距以下几个方面:JDK1.7在JDK1.7中,使用ArrayListlist=newArrayList()创建List集合时,底层直接创建了长度是10的Object[]数组elementData;在接下来调用add()方法向集合中添加元素时,如果本次的添加导致底层elementData数组......
  • 题解:CF2057D Gifts Order
    传送门Statement单点修改,全局查询所有\([l,r]\)中区间极差减去区间长度的最大值,多组数据。Solution首先,如果区间的最大/最小值出现在区间中间,区间长度的改变并不会对其造成影响,反之,当最大值出现在区间左右端点时,区间长度改变可能会产生影响。在保证区间最大/最小值存在......