[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. zkw 线段树-原理及其扩展

    前言 许多算法的本质是统计.线段树用于统计,是沟通原数组与前缀和的桥梁. <统计的力量>清华大学-张昆玮 关于线段树 前置知识:线段树 OIWiki. 线段树是一种专门维护区间问题的数据结 ...

  2. 超级干货:Air780E之RS485通信篇,你学会了吗?

    ​ 今天,我们来学习低功耗4G模组Air780E的RS485通信,同学们,你学习了吗? 一.RS485简介  物联网(IoT)在工业场景中的应用越来越广泛,而RS485是一种常见的通信协议,广泛应用于 ...

  3. OpenCompass使用LawBench数据测评本地Qwen大模型

    一.思维导图展示 二.OpenCompass简介 OpenCompass是一个大模型测评体系,开源.高效.同时集成CompassKit测评工具.CompassHub测评集社区,CompassRank测 ...

  4. php生成树状层级子孙树-迭代篇

    关于简单的方式获取树状层级子孙树的方案我已经写过了,在这里,当时是用简单的递归实现的,但是现在回头想想,如果层级很多,数据也很多,用递归感觉还是会不稳妥,这就有必要想办法转换为迭代来实现了. 以下是迭 ...

  5. Windows远程登录到VirtualBox安装的Ubuntu11.10

    一.环境 本地:Windows xp 虚拟机:VirtualBox 虚拟机的操作系统:Linux-Ubuntu11.10 二.目的 在Windows下通过SecureCRT(putty也可)远程登录到 ...

  6. Apache Tomcat AJP 实现负载均衡

    大部分一开始接触WEB服务器的人可能和我一样对为什么有Apache又有Tomcat服务器感到奇怪(它们还都是Apache开发的呵呵),其实他们不是冗余的服务器,虽然他们都能对外提供WEB服务器,但总的 ...

  7. Educational Codeforces Round 77 (Rated for Div2)

    B - Obtain Two Zeroes 给定两个整数\(a,b\),你可以执行以下操作任意次:每次操作选择一个正整数\(x\),使得\(a:=a-x,b:=b-2x\)或者\(a:=a-2x,b: ...

  8. 根据地址栏加载对应的TAB选项卡

    <script>   //左侧菜单的选中状态   $(".nav-fif-level li").each(function () {   var url = windo ...

  9. .NET 模拟&编辑平滑曲线

    本文介绍不依赖贝塞尔曲线,如何绘制一条平滑曲线,用于解决无贝塞尔控制点的情况下绘制曲线.但数据点不在贝塞尔曲线的场景. 在上一家公司我做过一个平滑曲线编辑工具,用于轮椅调整加减速曲线.基于几个用户可控 ...

  10. C/C++源码扫描系列- codeql 篇

    首发于 https://xz.aliyun.com/t/9275 概述 codeql 是一个静态源码扫描工具,支持 c, python, java 等语言,用户可以使用 ql 语言编写自定义规则识别软 ...