[BZOJ P2771] 天才ACM

传送门

朴素算法

枚举终点 \(r\),对区间 \([l, r]\) 排序求校验值 \(sum\),比较 \(sum\) 和 \(t\)

  • $ sum \le t $ r++
  • $ sum > t $ l=++r,ans++

时间复杂度N2log N

初步优化

考虑校验值单调不下降,可枚举左端点l时二分右端点r,再对区间l~r求校验值,更新方法如上

时间复杂度 \(O(N\log^2N)\)

但是我们会发现这道题还是过不去,于是仔细读题,发现有一个很恶心的K组数据,那么就需要进一步卡常优化

卡常 最后优化

可以发现,当我们二分右端点r时计算校验值会重复排序已排序的部分,考虑不去重复计算

  1. 使用归并的思想对满足条件的部分和待排序的部分合并,常数优化
  2. 前一步的基础是区间长度单调不减,所以考虑使用倍增思想增加长度,定义一个变量p,每次判断l~r+p是否满足校验值不大于T
    • 满足 r+=p,p<<=1;
    • 不满足 p>>=1
    • p==0 ans++,r++,l=r,p=1;

最后

总结一下,这道题是一道抽象的倍增和二分,思维难度较高但知识难度不是很高的好题,稍微需要一点卡常优化技巧

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5e5 + 5;
int t, n, m, ans;
LL s, sum;
LL a[N], f[N], mg[N];
inline void merge(int l, int r, int mid) {
int i = l, j = mid + 1;
for (int k = l;k <= r;k++)
if (j > r || i <= mid && f[i] <= f[j]) mg[k] = f[i++];
else mg[k] = f[j++];
}
inline bool check(int l, int r, int mid) {
for (int i = mid;i <= r;i++) f[i] = a[i];
sort(f + mid, f + r + 1);
merge(l, r, mid - 1);
sum = 0;
for (int i = 1;i <= ((r - l + 1) >> 1) && i <= m;i++) sum += (mg[r - i + 1] - mg[l + i - 1]) * (mg[r - i + 1] - mg[l + i - 1]);
if (sum <= s) {
for (int i = l;i <= r;i++) f[i] = mg[i];
return true;
}
else return false;
}
int main() {
scanf("%d", &t);
while (t--) {
ans = 0;
scanf("%d%d%lld", &n, &m, &s);
for (int i = 1;i <= n;i++) scanf("%lld", &a[i]);
int l = 1, r = 1, p = 1;
f[1] = a[1];
while (r <= n) {
if (p == 0) {
ans++, r++;
l = r, f[l] = a[l], p = 1;
}
else if (r + p <= n && check(l, r + p, r + 1)) r += p, p <<= 1;
else p >>= 1;
}
printf("%d\n", ans);
}
return 0;
}

[BZOJ P2771] 天才ACM的更多相关文章

  1. 天才ACM

    天才ACM 给定一个整数m,定义一个集合的权值为从这个集合中任意选出m对数(不够没关系,选到尽可能选,凑不成对的舍去),每对数两个数的差的平方的和的最大值. 现在给出一个数列\(\{a_i\}\),询 ...

  2. AcWing:109. 天才ACM(倍增 + 归并排序)

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

  3. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  4. (暂时弃坑)(半成品)ACM数论之旅18---反演定理 第二回 Mobius反演(莫比乌斯反演)((づ ̄3 ̄)づ天才第一步,雀。。。。)

    莫比乌斯反演也是反演定理的一种 既然我们已经学了二项式反演定理 那莫比乌斯反演定理与二项式反演定理一样,不求甚解,只求会用 莫比乌斯反演长下面这个样子(=・ω・=) d|n,表示n能够整除d,也就是d ...

  5. BZOJ 4373: 算术天才⑨与等差数列 线段树

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  6. bzoj 4373: 算术天才⑨与等差数列 hash

    题目链接 题目大意:  给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列. 另一种是将位置x的数变为y. 强制在线. 可以用hash来 ...

  7. bzoj 4912: [Sdoi2017]天才黑客

    Description Solution 这个题和点没什么关系 , 之和边与边之间关系有关 , 我们就把边看作点 , 边权就是 \(lcp\) , 点权看作这条边本来的权值. 现在考虑两两连边 , \ ...

  8. BZOJ 4373 算术天才⑨与等差数列 线段树+set(恶心死我了)

    mdzz,这道题重构了4遍,花了一个晚上... 满足等差数列的条件: 1. 假设min是区间最小值,max是区间最大值,那么 max-min+k(r−l) 2. 区间相邻两个数之差的绝对值的gcd=k ...

  9. AC日记——算术天才⑨与等差数列 bzoj 4373

    4373 思路: 判断一个数列是否是等差数列: 1,最大值减去最小值==(区间个数-1)*k: 2,gcd==k: 3,不能有重复(不会这判断这一条,但是数据水就过了): 来,上代码: #includ ...

  10. ACM学习历程—BZOJ 2115 Xor(dfs && 独立回路 && xor高斯消元)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 题目大意是求一条从1到n的路径,使得路径xor和最大. 可以发现想枚举1到n的所有路 ...

随机推荐

  1. Visual Studio 快速分析 .NET Dump 文件

    前言 在开发和维护 .NET 应用程序的过程中,有时会遇到难以捉摸的性能瓶颈或内存泄漏等问题.这些问题往往发生在生产环境中,难以复现.为了更准确地诊断这些运行时问题,通常会收集应用程序在生产环境中的内 ...

  2. Moebius for SQL Server

    Moebius(莫比斯)介绍 Moebius数据库多活集群是格瑞趋势为SQL Server数据库研发的能够同时满足可用性.数据安全.容灾.读写分离.负载均衡的一站式多活集群.集群的名字取自Moebiu ...

  3. 能不能用uni开发一个线上运动会的APP、小程序?

    引言:uni-app凭借其强大的跨平台能力,成为开发AI运动类APP和小程序的首选框架.本文旨在探讨基于uni进行开发AI运动小程序.APP开发,以及开发过程中遇到的技术难点,并为您介绍一个开箱即用的 ...

  4. Spring MVC 3.2 技术预览(一):Servlet 3介绍,异步支持

    原文地址:http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-supp ...

  5. 解决node报错ERR_OSSL_EVP_UNSUPPORTED

    "scripts": {//修改启动dev方式 "dev": "SET NODE_OPTIONS=--openssl-legacy-provider ...

  6. [天坑]之qrcode二维码在app内置浏览器中无法显示问题

    记录一下最近的工作难点,之一... 首先本项目使用的是qrcode-generator,市面上生成二维码的第三方库有很多qrcode.vue.qrcode.QRious等等 <div id=&q ...

  7. vscode代码注释插件koroFileHeader配置(自用)

    前言 一直以来写注释都是让人头疼的问题,力求保持注释风格统一也很麻烦,偶然间发现的这款vscode中的注释插件koroFileHeader,配置好后可以大大提高写注释的效率与积极性♪(∇*) 安装插件 ...

  8. cas5配置redis

    ​POM文件加载redis依赖,重新maven clean package <dependency> <groupId>org.apereo.cas</groupId&g ...

  9. 使用IntersectionObserver 实现懒加载 && 记录一个懒加载失效的原因

    先说说我实现懒加载失效的一个原因: 是图片没有写高度 猜想是没有给图片高度,所以底层没法进行计算 容器是否出现在视图中 IntersectionObservers作用 提供了一种异步观察目标元素与其祖 ...

  10. Flutter TickerProvider使用

    Flutter TickerProvider使用 当需要使用Animation controller时,需要在控制器初始化时传递一个vsync参数,此时需要用到TickerProvider,例如 cl ...