CH109 Genius ACM 题解报告

题目传送门

【题目大意】

【思路分析】

首先显然可知,当一段区间内选出的$M$对数分别是,最大和最小一对,次大和次小一对,……,第$M$大和第$M$小一对,此时的“校验值”最大,如果这段区间的最大“校验值”满足条件了,那么这个区间就是合法的。我们考虑将数列$A$从头开始分段,在满足每段区间合法的情况下让区间尽量包含更多的数,到达结尾时整个数组分成的段数就是答案。

于是我们要解决的问题就是,当确定一个区间的左端点$L$后,右端点$R$在满足$A[L]~A[R]$的“校验值”不超过$T$的情况下,最大能取到多少。

求长度为$N$的一段区间的“校验值”需要排序配对,时间复杂度为$O(N*log_2N)$。当“校验值”上限$T$比较小时,如果在整个$L~N$的区间上二分右端点$R$,二分的第一步就要检验$(N-L)/2$这么长的一段,最终右端点$R$却可能只扩展了一点,浪费了很多时间,于是我们考虑使用倍增算法。

倍增过程如下:

1.初始化:$p=1,R=L$

2.求出$[L,R+p]$这一段区间的“校验值”,若$\le T$,则$R+=p,p*=2$,否则$p/=2$

3.重复上一步,直到$p$的值变为0,此时$R$即为所求

【代码实现】

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #define rg register
 5 #define ll long long
 6 #define go(i,a,b) for(rg int i=a;i<=b;i++)
 7 using namespace std;
 8 const int N=500002;
 9 int K,n,m,a[N],b[N],c[N];
10 ll t;
11 bool check(int l,int mid,int r){
12     go(i,mid,r) b[i]=a[i];
13     sort(b+mid,b+r+1);
14     int i=l,j=mid;
15     go(k,l,r)
16         if((i<=mid-1&&b[i]<b[j])||j>r) c[k]=b[i++];
17         else c[k]=b[j++];
18     i=l,j=r;int num=min(m,(r-l+1)/2);ll sum=0;
19     while(num--)
20         sum+=(ll)(c[i]-c[j])*(c[i]-c[j]),i++,j--;
21     if(sum<=t){
22         go(i,l,r) b[i]=c[i];
23         return 1;
24     }
25     return 0;
26 }
27 int main(){
28     scanf("%d",&K);
29     while(K--){
30         scanf("%d%d%lld",&n,&m,&t);
31         go(i,1,n) scanf("%d",&a[i]);
32         int l=1,r=1,p=1,ans=0;b[1]=a[1];
33         while(l<=n){
34             if(r+p<=n&&check(l,r+1,r+p)) r+=p,p*=2;
35             else p/=2;
36             if(!p||r==n) ans++,l=++r,p=1,b[l]=a[l];
37         }
38         printf("%d\n",ans);
39     }
40     return 0;
41 }

代码实现

原文地址:https://www.cnblogs.com/THWZF/p/11276206.html

时间: 2024-08-04 23:30:27

CH109 Genius ACM 题解报告的相关文章

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

线段树&#183;题解报告

线段树·题解报告 参考资料 ·课件 线段树 --刘汝佳 统计的力量,线段树全接触 --张昆玮 ·Blog [完全版]线段树 从普通线段树到zkw线段树 [总结][数据结构]ZKW线段树详解 选题目录 · Hdu1166 敌兵布阵(单点更新,区间求和) · Hdu1754 I Hate It(单点更新,RMQ) · Hdu3308 LCIS(单点更新,区间并) · Poj3468 A Simple Problem with Integers(区间加减,区间求和) · Poj2777 Count C

cojs 强连通图计数1-2 题解报告

OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一改就可以了 首先我们考虑不合法的方案强连通分量缩点后一定是DAG 考虑子问题:DAG计数 做法可以参考<cojs DAG计数1-4 题解报告> 这里给出转移方程 f(n)=sigma((-1)^(k-1)*C(n,k)*2^(k*(n-k))*f(n-k)) 如果考虑上强连通分量缩点的情况呢? 我

ACM总结报告

ACM总结报告       算法设计     姓名:杨加勇 学号:20143617 专业:计算机2班 指导老师:费玉奎        说是报告,其实更算是个总结,这学期这门选修课所学知识的一个大致总结.还是开始选择这门课时所说的,并无后悔或者惋惜一说,算法或许在以后一点也用不到,这个只是或许一直荒废,我不考研,也不去参加什么竞赛,工作也只是将关于计算机的作为一个过渡,我只想去创业,我只想管理自己创造出来的小小财富或是团队或是公司,但我相信,算法所设计的策略思维模式,与其他管理等决策的问题的解决方

ACM总结报告!

ACM总结报告 算法设计 姓名:郭嘉 学号:2015590 专业:网络工程二班 指导老师:费玉奎. 第一次听说ACM这个事情是我们的计算机导论老师岳训老师介绍给我的,他可以算是我计算机的启蒙老师,带我走进了计算机这个大世界.他让我知道了一个优秀的程序员就像是一位"武林高手"一样,需要掌握 "内功"和"外功",外功指的就是程序设计语言,比如C.C++.Java.Python.而内功就是指算法,数据结构,设计模式等等.这"内功"和

ACM程序设计报告

ACM程序设计报告 - -王浩 14级计算机4班 通过十六周的acm程序设计实习,感受颇深,acm不仅仅是对编程能力的锻炼,更是对逻辑思维能力的提升.从第一专题到第四专题,stl,贪心算法,搜索,背包,动态规划,图论,最小生成树等等,这些知识都是之前在各门课中接触到过的,但是在acm中,我对算法有了一个新的认识,也对之前学的知识有了更深入的认识. 对acm的认识是从大一开始的,当时在东校的时候也是到本部参加了一段时间的acm程序设计课,当时接触的东西比较少,而且是光学了C语言,对程序设计的理解非

题解报告:hdu 1162 Eddy&#39;s picture

Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result i

题解报告:poj 3320 Jessica&#39;s Reading Problem(尺取法)

Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The final exam is coming, yet she has spent little time on it. If she wants to pass it, she has to master all ideas included in a very thick text book. The au

题解报告:poj 2480 Longge&#39;s problem(欧拉函数)

Description Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms. Now a problem comes: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N.