题目链接 1384 -- Genius ACM

给定一个整数 m,对于任意一个整数集合 S,定义“校验值”如下:
从集合 S 中取出 m 对数(即 2*M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 m 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值 就称为集合 S 的“校验值”。
现在给定一个长度为 n 的数列 A 以及一个整数 k。我们要把 A 分成若干段,使得 每一段的“校验值”都不超过 k。求最少需要分成几段。

#include<bits/stdc++.h>
using namespace std;
#define maxn 600005
#define LL long long
int a[maxn],b[maxn],c[maxn];
int n,m;
LL k;
void mem(int l,int mid,int r){
   ,zz=r,ii=l;
   while(i<=mid&&j<=r){
      if(b[i]<b[j]) c[ii++]=b[i++];
      else c[ii++]=b[j++];
   }
   while(i<=mid) c[ii++]=b[i++];
   while(j<=r) c[ii++]=b[j++];
}
bool xxx(int l,int mid,int r){
   mem(l,mid,r);
   LL ans=,i=,j=l,kk=r;
   while(j<kk&&i<m){
      LL z=;
      z=1LL*(c[j++]-c[kk--]);
      ans+=z*z;
      i++;
   }
   ;
   ;
}
bool work(int l,int r,int rr){
   ;j<=r;j++) b[j]=a[j]; // 每次只用在b后面加上我们后来倍增的一段区间
   sort(b+rr+,b+r+);  // 把增加的一段排序 后面可以用归并
   ;
   ;
}
int main(){
   int t;
   cin>>t;
   while(t--){
      scanf("%d%d%lld",&n,&m,&k);
      ;j<=n;j++){
         scanf("%d",&a[j]);
      }
      ;
      ,p=,r=l;
      b[]=a[];
      while(l<=n){
         if((r+p)<=n&&work(l,r+p,r)){
             for(int i=l;i<=r+p;i++) b[i]=c[i];  //把每次符合的序列按顺序放在b里面
             r+=p;
             p*=;
         };
         ){
            l=r+;
            r=l;
            p=;
            ans++;
         }
      }
      cout<<ans<<endl;
   }
}

hihocoder--1384 -- Genius ACM (倍增 归并)的更多相关文章

  1. [hihocoder #1384] Genius ACM 解题报告(倍增)

    题目链接:http://hihocoder.com/problemset/problem/1384 题目大意: 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M ...

  2. hihoCoder#1384 : Genius ACM

    对于一个固定的区间$[l,r]$,显然只要将里面的数字从小到大排序后将最小的$m$个和最大的$m$个配对即可. 如果固定左端点,那么随着右端点的右移,$SPD$值单调不降,所以尽量把右端点往右移,贪心 ...

  3. $CH0601\ Genius\ ACM$ 倍增优化DP

    ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...

  4. CH0601 Genius ACM【倍增】【归并排序】

    0601 Genius ACM 0x00「基本算法」例题 描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数 ...

  5. Contest Hunter 0601 Genius ACM

    Genius ACM Advanced CPU Manufacturer (ACM) is one of the best CPU manufacturer in the world. Every d ...

  6. ACM-ICPC Beijing 2016 Genius ACM(倍增+二分)

    描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 M 对,则取到不能取为止),使 ...

  7. hihocoder1384/CH0601 Genius ACM[贪心+倍增+归并排序]

    提交地址. 关于lyd给的倍增方法,即从当前枚举向后的$2^k$长度($k$从$1$开始),如果可行就将$k$加一以扩大范围,不可行时将范围不断减半直至$0$. 举个例子,假设当下在1,目标答案是13 ...

  8. Genius ACM

    题解: 发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算 比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$ 没错暴力的最差复杂度是$n^2*logn$的 发现长度与次 ...

  9. XJOI 7191 Genius ACM

    二分+倍增 题目 题目中的最大校验值应由数组排序后,取出最大值和最小值,次大值和次小值--进行做差平方取和 所以在加入一个新的数时,校验值是不会下降的 那么可以发现,校验值是单调递增的,所以可以用二分 ...

随机推荐

  1. 临时的ThisCall

    // 获取当前定位 changeCity: function () { let that = this; that.locationClose(); Upj._changeCity().then((d ...

  2. 剑指offer(12)

    来两道关于链表链接的题目: 题目一: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 本题要考虑到其中一条链表是空或者两个都是空的情况. 在每个链表安上一 ...

  3. kubernetes常用命令

    #.查询信息 kubectl get [需要查询的服务]   node 节点componentstatuses 简写 cs 组件状态namespaces 简写 ns 名命空间pod pod信息 添加  ...

  4. lombok标签之@Data @AllArgsConstructor @@NoArgsConstructor -如何去除get,set方法。@Data注解和如何使用,lombok

    在代码中我们可以只加上标签@Data 而不用get,set方法: val : 和 scala 中 val 同名, 可以在运行时确定类型; @NonNull : 注解在参数上, 如果该类参数为 null ...

  5. 关于Select2下拉框组件

    文档如下: https://select2.org/configuration/options-api

  6. PHP通过循环给数组赋值

    $userDatas = [ ['user_id'=>1], ['user_id'=>3] ]; $userIds = []; foreach ($userDatas as $item){ ...

  7. Ubuntu install flash

    Software&Updates - Other Software - Canonical Parners sudo apt install adobe-flashplugin

  8. 工厂类,配置文件,静态方法,反射构成编译器解耦;ioc的一个概念 ;通过xml创建容器里面存储对象

    工厂类,配置文件,静态,反射方法构成编译器解耦;ioc的一个概念

  9. x = x &(x-1)

    判断一个数(x)的二进制含有几个1 int func(x) { ; while(x) { countx ++; x = x&(x-); } return countx; } 假定x = 999 ...

  10. 实现中英文混合string的逆向输出

    #include <iostream> using namespace std; // 输入一个字符串(包括英文和中文),将其反序输出, 如: // hello 今天真热 ---> ...