[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. 一文搞懂 ARM 64 系列: ADD(立即数版)

    汇编中,加法指令很重要,因为它是执行其他很多指令的基础. 同时,加法指令也会影响NZCV标志.有关NZCV的介绍,可以参看<一文搞懂 ARM 64 系列: ADC>. ARM64汇编中,A ...

  2. ARC133D Range XOR

    ARC133D Range XOR 题目链接:[ARC133D] Range XOR 非常好数位 dp. 思路 根据异或的前缀和,我们可以把式子化成这样. \[\sum_{i=l}^r\sum_{j= ...

  3. P5987 [PA2019] Terytoria / 2023NOIP A层联测13 T3 全球覆盖

    P5987 [PA2019] Terytoria / 2023NOIP A层联测13 T3 全球覆盖 题面及数据范围 对于一个点对,可以降维为线段,转化为 1 维的问题. 如图: 我们可以在横着的方向 ...

  4. []JSR 133 (Java Memory Model) FAQ

    JSR 133 (Java Memory Model) FAQ Jeremy Manson and Brian Goetz, February 2004 内容列表 究竟什么是内存模型? 其它语言,像C ...

  5. apache+jk+tomcat集群+session同步

    apache2+tomcat5.5集群+session同步 作者:刘宇 liuyu.blog.51cto.com msn群:mgroup49073@hotmail.com (linuxtone)   ...

  6. golang配置读取值viper

    viper简介 Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序.它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式.它支持: 设置默认值 从JSON.TOML.Y ...

  7. Blazor 组件库 BootstrapBlazor 中Card组件介绍

    一个较为完整的Card样子 Card组件介绍 Card组件分为三部分,CardHeader.CardBody.CardFooter. 代码格式如下: <Card> <CardHead ...

  8. Codeforces Round 797 (Div

    Codeforces Round 797 (Div. 3) Price Maximization 给定\(n\)个商品(n为偶数),每个商品的重量为\(a_i\),你需要将其两两打包,打包的成本为\( ...

  9. VLC web(http)控制 (4) 服务器文件获取

    通过链接 http://127.0.0.1:8080/requests/browse.xml?uri=file%3A%2F%2F~ 可以获取服务器默认目录所有文件. 其中file%3A%2F%2F~是 ...

  10. PM-数据治理-数据资产管理

      在组织中,并非所有的数据都构成数据资产,数据资产是能够为组织产生价值的数据,数据资产的形成需要对数据进行主动管理并形成有效控制.   数据资产管理是规划.控制和提供数据及信息资产的一组业务职能,包 ...