首页 > 其他分享 >C. Insert and Equalize

C. Insert and Equalize

时间:2023-12-06 15:44:23浏览次数:27  
标签:Insert gcd max ll leq Equalize new 数列

原题链接

导论

1.数列末尾插入一个没有在数列中出现过的数,然后对数列中的每个数加上x的若干倍数(其中的x对于每个数而言均相同),使得数列中的所有数均相等
2.由导论1可以推出,x一定是 \(|a[i]-a[j]|(1\leq i,j\leq n)\)的最大公约数
3.导论2的时间复杂度显然太高了,因此猜想\(gcd(|a[i]-a[j]|,(1 \leq i,j \leq n))==gcd(|a[i]-a[i-1]|,(i\in[2,n]))\)(啊啊啊我还不会证)
4.我们令所有元素相等时的值为b,那么b一定等于a[max]或者a[max]+gcd。所以最基础的,至少要把所有元素加到与最大值相等。然后考虑新插入的值,如果a[min]~a[max]之间有new的存身之地,那么new就去那(这里隐含着双指针法)。如果没有,new就变成a[max]+gcd,然后总体次数再加n

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        ll n;
        scanf("%d",&n);
        ll a[200005];
        for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
        sort(a+1,a+n+1);
        ll g=0;
        for(ll i=2;i<=n;i++)g=__gcd(g,a[i]-a[i-1]);
        ll sum=0;
        for(ll i=1;i<n;i++)sum+=(a[n]-a[i])/g;
        ll x=a[n]-g;
        int flag=1;
        for(ll i=n-1;i>=1;i--)
        {
            if(x!=a[i])
            {
                sum+=n-i;
                flag=0;
                break;
            }
            x-=g;
        }
        if(flag)sum+=n;
        printf("%lld\n",sum);
    }
    return 0;
}

标签:Insert,gcd,max,ll,leq,Equalize,new,数列
From: https://www.cnblogs.com/pure4knowledge/p/17879675.html

相关文章

  • perl:mysql binlog iud (insert、update、delete)分析 小脚本:实用程序
    1#!/usr/bin/perl2#utf-834usestrict;5usePOSIX;6useTime::HiResqw/sleeptime/;78$|=1;910my$line='#-----------------------------------------------------------------------';11my$debug=0;1213##------------......
  • CF1902 C Insert and Equalize 题解
    LinkCF1902CInsertandEqualizeQuestion有一个\(n\)个元素的数组\(a\),每个元素都不一样现在我们需要在\(a\)中添加一个数字\(a_{n+1}\),和之前的元素都不一样然后选择一个数\(x\),可以在一个元素上加\(x\),为操作一次,(每次加的数都是\(x\))求,操作的最少次数Solution......
  • 详解十大经典排序算法(三):插入排序(Insertion Sort)
    算法原理每次从无序部分选择一个元素,将其插入到有序部分的正确位置,重复这个过程直至整个数组有序。算法描述插入排序是一种简单直观的排序算法,它的基本思想是将一个待排序的元素插入到已经排序好的序列中的适当位置,从而得到一个新的、长度加一的有序序列。插入排序的过程类似于整理......
  • F5 Insert XForwarded For配置
    一、应用场景: 统一权限系统用户登录日志中登录IP一直显示10.122.6.70,而不是用户电脑的实际IP,经查证该IP为F5负载均衡设备IP。登录IP一直显示F5设备IP原因为,网络组为统一权限系统的虚拟IP配置连接池时http参数没有开启InsertXForwardedFor服务导致。与网络组沟通重新创建profile_......
  • SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解
    SQLSELECTINTO语句SELECTINTO语句将数据从一个表复制到一个新表中。SELECTINTO语法将所有列复制到新表中:SELECT*INTOnewtable[INexternaldb]FROMoldtableWHEREcondition;只复制一些列到新表中:SELECTcolumn1,column2,column3,...INTOnewtable[INexte......
  • SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解
    SQLSELECTINTO语句SELECTINTO语句将数据从一个表复制到一个新表中。SELECTINTO语法将所有列复制到新表中:SELECT*INTOnewtable[INexternaldb]FROMoldtableWHEREcondition;只复制一些列到新表中:SELECTcolumn1,column2,column3,...INTOnewtable[INext......
  • [Codeforces] CF1799B Equalize by Divide
    序列操作(divide.cpp)—CF1799B—1200题目描述给您一个\(a_1,a_2,\dotsa_n\)这样的正整数数组,您可以对它进行多次(可以是零次)这样的操作:选择两个索引\(i,j(1\leqi,j\leqn,i\neqj)\);将\(a_i\)赋值为\(\lceil\frac{a_i}{a_j}\rceil\)。这里的\(\lceilx\rceil\)......
  • mysql c++ create table,insert,select
    CREATETABLE`t1`(`id`bigintunsignedNOTNULLAUTO_INCREMENTprimarykey,`author`varchar(40)NOTNULLDEFAULT'',`comment`varchar(40)NOTNULLDEFAULT'',`content`varchar(40)NOTNULLDEFAULT'',`header`......
  • SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段
    SQLINSERTINTO语句用于在表中插入新记录。INSERTINTO语法可以以两种方式编写INSERTINTO语句:指定要插入的列名和值:INSERTINTO表名(列1,列2,列3,...)VALUES(值1,值2,值3,...);如果要为表的所有列添加值,则无需在SQL查询中指定列名。但是,请确保值的顺序与表......
  • SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段
    SQLINSERTINTO语句用于在表中插入新记录。INSERTINTO语法可以以两种方式编写INSERTINTO语句:指定要插入的列名和值:INSERTINTO表名(列1,列2,列3,...)VALUES(值1,值2,值3,...);如果要为表的所有列添加值,则无需在SQL查询中指定列名。但是,请确保值的顺序与表......