[ABC339G] Smaller Sum(分块 卡常 qwq)

news/2024/11/15 13:45:45/文章来源:https://www.cnblogs.com/wenzieee/p/18547801

link

和 数列分块入门 2 差不多的思路,

对每个块排序,然后就可以在上面二分,求和,发现都是在二分出来的位置前面的数,可以用前缀和预处理出来

分块按照一般分法

n, q 同阶,时间复杂度是 \(O(n\sqrt{n}\log\sqrt{n})\)

然后交上去发现最后几个点 T 了,算一下,大概是 2e5 * 450 * 8 = 7e8,时限是 3.5s,可承受的时间应该是 3.5 * 1e8 = 3.5e8 左右

超了一些

注意这里前后两个 \(\sqrt{n}\) 的意义是不同的,前面表示块数,后面的表示平均块长

注意到 \(f(x) = x\)\(g(x) = \log_2x\) 的增长是有差距的,后一个显然增长更慢

那么我们考虑调整块长,让块数少一点,块长大一点,这样前一个的减少量肯定是远大于后一个的增加量的

比如调整块长为 2000,也就是 \(O(n * \frac{n}{2000} * \log(2000))\),2e5 * 100 * 10 = 2e8

所以,分块卡常一般就是调整块数与块长之间的大小(可能吧

#include <bits/stdc++.h>
#define re register int 
#define int long long using namespace std;
const int N = 2e5 + 10;int n, m, a[N];
int pos[N], L[N], R[N], sum[1010][2010];vector<int> v[1010];inline void init()
{int t = n / 2000 + (n % 2000 ? 1 : 0);for (re i = 1; i <= t; i ++){L[i] = (i - 1) * 2000 + 1;R[i] = i * 2000;}if (R[t] < n) t ++, L[t] = R[t - 1] + 1, R[t] = n;for (re i = 1; i <= t; i ++){for (re j = L[i]; j <= R[i]; j ++){pos[j] = i;v[i].push_back(a[j]);}sort(v[i].begin(), v[i].end());for (re j = 0; j < v[i].size(); j ++){if (j == 0) sum[i][j] = v[i][j];else sum[i][j] = sum[i][j - 1] + v[i][j];}}
//	for (re i = 1; i <= n; i ++) cout << pos[i] << ' '; cout << '\n';	
}inline int query(int l, int r, int c)
{int p = pos[l], q = pos[r];int res = 0;if (p == q){for (re i = l; i <= r; i ++)if (a[i] <= c) res += a[i];}else {for (re i = l; i <= R[p]; i ++)if (a[i] <= c) res += a[i];for (re i = L[q]; i <= r; i ++)if (a[i] <= c) res += a[i];for (re i = p + 1; i <= q - 1; i ++){int x = upper_bound(v[i].begin(), v[i].end(), c) - v[i].begin();if (x - 1 < 0) continue;res += sum[i][x - 1];}}return res;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin >> n;for (re i = 1; i <= n; i ++) cin >> a[i];init();cin >> m;int last = 0;while (m --){int l, r, c; cin >> l >> r >> c; l ^= last, r ^= last, c ^= last;int ans = query(l, r, c);cout << ans << '\n';last = ans;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834010.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[TJOI2007] 路标设置

[[TJOI2007] 路标设置(https://www.luogu.com.cn/problem/P3853) 题目 B 市和 T 市之间有一条长长的高速公路,公路上相邻路标的最大距离定义为该公路的“空旷指数”。现在公路上增设一些路标,使得公路的“空旷指数”最小。请设计一个程序计算能达到的最小值是多少。请注意,公…

TBM810-ASEMI贴片桥堆8A 1000V

TBM810-ASEMI贴片桥堆8A 1000V编辑:ll TBM810-ASEMI贴片桥堆8A 1000V 型号:TBM810 品牌:ASEMI 封装:TBM-4 特性:贴片桥堆 正向电流:8A 反向耐压:1000V 恢复时间:>2000ns 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 浪涌电流:50A 漏电流:>10uA 工作温度:-55℃~150…

Python开发环境搭建(PyCharm+Anaconda+Git+Gitee)

一、Anaconda介绍 1.1 为什么选择Anaconda? Anaconda是一个开源的Python发行版本,主要用于数据科学和机器学习,它包含了Python、conda以及众多工具和库,让我们可以轻松的构建和管理python虚拟环境,方便的进行python项目开发。下面是选择Anaconda的理由:安装简单方便 便捷…

Visual Studio 快速分析 .NET Dump 文件

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

使用model-viewer加载glb文件

实现效果代码 react项目引入方式可选其一1.在html中引入 <script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>npm 或者 yarn安装yarn add @google/model-viewerindex.jsimport React, { …

关于定时器周期、频率等相关计算

1、定时器作为计数器,时钟频率计算如下图: 2、定时器产生一次更新中断时间计算,如下: 当定时器设置为边沿对齐模式和向上计数模式时,定时器计数到重装载值(arr)产生一次中断,产生一次中断的时间为: 其中:T为定时器周期,也为此处产生一次中断的时间;arr为重装载值…

useCallback 和 useMemo 使用场景

一切为了性能,无论是 useCallback 还是 useMemo 还是 memo,都是为了让不该渲染的组件不去渲染 在学习 useCallback、useMemo 之前,我们需要知道一点,React 的渲染是自顶而下,如果父组件渲染了,那么子组件也会渲染,其子孙组件“世世代代”都要渲染 但如果父组件的渲染与子…

[LeetCode 最大岛屿面积

### DFS解法``` python class Solution:dir = [(-1,0),(1,0),(0,-1),(0,1)]def dfs(self,grid,x,DFS解法 class Solution:dir = [(-1,0),(1,0),(0,-1),(0,1)]def dfs(self,grid,x,y):if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] != 1…

【Ubuntu】在Ubuntu上安装微信

【Ubuntu】在Ubuntu上安装微信 零、说明 微信官网最近发布了Linux的测试版本,实际使用下来与Windows版本相差不多,本文介绍如何在Ubuntu(Debian系)上安装Linux版本的微信。 壹、下载 打开Linux微信官网:https://linux.weixin.qq.com/,根据自己的处理器架构选择对应的deb格…

文件共享服务之NFS挂载实验

任务需求 1.部署一台web服务器,提供静态网页的展示,该网站的html等静态资源远程存储在NFS服务器。 2.部署NFS服务器,创建共享文件夹(提供静态文件),发布该共享目录,提供给web服务器使用。 主机列表 # 外网地址 内网地址 主机名 192.168.122.207…

第 5 篇 Scrum 冲刺博客

团队作业4——第 5 篇 Scrum 冲刺博客 作业要求这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13234这个作业的目标 团队集体协作完成项目开发队名 雄狮般的男人站立式…

Sitecore debug 工具

由于 Sitecore 的调试需要老是通过 log 来分析,而每次更新 dll 都需要等待一定的时间和重复执行前端的操作逻辑,特开发一个在线编辑器的方式来方便调试。警告:请勿在生产环境使用。截图构建项目 打开 Frontend,使用 pnpm i 安装依赖包,然后 pnpm build:vite 构建项目,之后…