01.03 CW 模拟赛 T4. ring

news/2025/1/6 9:30:57/文章来源:https://www.cnblogs.com/YzaCsp/p/18651449

前言

找原题未遂了()
\(\rm{HD0X}\) 大佬讲了没听懂啊

思路

无敌了, 看起来似乎很困难, 不知道补不补的掉

首先发现不好处理成一种简单的问题, 肯定是想有哪些方法可以处理这种问题
\(\rm{TJ}\) 的不太看得懂

  • 你可以树状数组维护区间和, 每次对于一个环暴力修改 \(\mathcal{O} (sz \log n)\), 然后查询 \(\mathcal{O} (\log n)\)
  • 你也可以对一个环标记其旋转次数, 这样子做修改是 \(\mathcal{O} (1)\) 的, 查询比较复杂:
    首先我们对于每个环计算其对区间的贡献, 具体的, 二分查找这个环的贡献区间, 然后常规计算
    那么这样子查询是 \(\mathcal{O} (m \log sz)\)

现在我们已经有了这两种做法, 你发现这两种做法完全不同阶, 第一种做法 \(sz\) 影响最大, 第二种做法 \(m\) 影响最大, 考虑根号分治
所以设阈值 \(B\) , 假设低于阈值使用方法 \(1\) , 否则使用方法 \(2\) , 因为 \(sz\) 足够大时, 方法 \(2\) 的查询复杂度将被压缩

你发现现在的总时间复杂度为 \(\mathcal{O} (B \log n + \frac{n}{B} \log n)\) (假设 \(n, m, q\) 同阶)

\(B = \sqrt{n}\) , 时间复杂度达到最优, 为 \(\mathcal{O} (n \sqrt{n \log^2 n})\)

这什么神经复杂度, 算了一下达到了 \(9 \times 10^8\) , 肯定是搞不过去的
啊, 过啦

考虑优化, 但是不用也能过, 参考 题解

实现

框架

写的清楚一点, 这是码力题 :
首先处理每一个环的大小 (根据阈值分开)
对于每次修改, 小环直接暴力旋转, 大环打个标记
对于每次查询, 小环直接树状数组启动, 对于大环单独计算贡献

代码

参考 \(\rm{KLR}\) 大佬的代码

#include "iostream"
#include "algorithm"using namespace std;#define int long long
#define lowbit(x) x & -x
//#define getchar getchar_unlockedtemplate <class T>
void read(T &x) {x = 0; char ch = getchar();while (ch < '0' or ch > '9') ch = getchar();while (ch >= '0' and ch <= '9') x = x * 10 + ch - 48, ch = getchar();
}void print(int x) {if (x > 9) print(x / 10);putchar(x % 10 + '0');
}constexpr int N = 1.5e5 + 10, B = 666;int n, m, Q;
int a[N], tg[N];
basic_string<int> c[N], pre[N], ex;class Binary_Indexed_Tree {
protected:int tr[N];public:	void update(int x, int k) { for (; x <= n; x += lowbit(x)) tr[x] += k; }int query(int x) {int ret = 0;for (; x; x -= lowbit(x)) ret += tr[x];return ret;	}int query(int l, int r) { return query(r) - query(l - 1); }} bit;void init() {read(n), read(m), read(Q);for (int i = 1, x; i <= n; ++i) read(x), c[x].push_back(i);for (int i = 1; i <= n; ++i) read(a[i]);for (int i = 1; i <= m; ++i) {if (c[i].size() <= B) for (int x : c[i]) bit.update(x, a[x]);else {ex.push_back(i);int tmp = 0;for (int x : c[i]) pre[i].push_back(tmp += a[x]);}}
}int deal(int x, int l, int r) {l = lower_bound(c[x].begin(), c[x].end(), l) - c[x].begin(), r = upper_bound(c[x].begin(), c[x].end(), r) - c[x].begin() - 1;if (l >= (int)c[x].size() or r < l) return 0;l = (l + c[x].size() - tg[x]) % c[x].size(), r = (r + c[x].size() - tg[x]) % c[x].size();if (l > r) return *pre[x].rbegin() - (pre[x][l - 1] - pre[x][r]);return pre[x][r] - (l ? pre[x][l - 1] : 0);
}void swp(int x) {if (c[x].empty()) return;for (int i : c[x]) bit.update(i, -a[i]);bit.update(c[x][0], a[c[x][c[x].size() - 1]]);for (int i = c[x].size() - 1; i; --i) bit.update(c[x][i], a[c[x][i - 1]]);for (int i = c[x].size() - 1; i; --i) swap(a[c[x][i]], a[c[x][i - 1]]);
}void calculate() {while (Q--) {int op, l, r;read(op), read(l);if (op & 1) {read(r);int ans = bit.query(l, r);for (int x : ex) ans += deal(x, l, r);print(ans), putchar('\n');}else {if (c[l].size() <= B) swp(l);else ++tg[l];}}
}void solve() {init();calculate();
}signed main() {solve();return 0;
}

总结

这个题的 \(\rm{subtask}\) 提示的非常完备, 挨着想肯定能想出来

根号分治无敌, 这个题属于超级巨大根号分治, 害怕

多种做法可以用根号分治均摊, 前提是需要有可以分治的点

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

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

相关文章

发布blazor应用到Linux, 使用nginx作为WebSocket代理

Blazor 使用了SignalR连接, 而SignalR使用的是WebSocket WebSocket协议提供了一种创建支持客户端和服务器之间实时双向通信的 Web 应用程序的方法。作为 HTML5 的一部分,WebSocket 使开发此类应用程序比以前的方法容易得多。大多数现代浏览器都支持 WebSocket,包括 Chrome、F…

读数据保护:工作负载的可恢复性25公用云存储

公有云存储1. 对象存储 1.1. 对象存储可能是未来比较适合长期保存备份与档案的一种技术 1.2. 它的核心功能本身就已经含有保护数据所需的一些特性 1.3. 对象存储系统里的所有数据都能自动复制到多个地点,这意味着它天生就符合3-2-1原则 1.4. 对象存储还可以应对磁退化的问题,…

C#进阶

进阶 目录进阶枚举数组值类型和引用类型函数函数基础ref和out变长参数和参数默认值函数重载递归函数复杂数据类型结构体排序冒泡排序选择排序飞行棋项目C#高级语法面向对象成员变量构造函数成员属性索引器静态成员拓展方法运算符重载内部类和分部类继承里氏替换原则继承中的构造…

P11503 [NordicOI 2018] Nordic Camping

P11503 [NordicOI 2018] Nordic Camping 花了我挺长时间。 帐篷都是正方形的,可以枚举左上角,二分正方形边长,二维前缀和判断是否合法。这部分复杂度为 \(O(n^2\log n)\)。处理出来后,问题似乎就变成了矩形取最大值,单点查询。直接做是 \(\log^2\) 的,65 pts。具体就是,…

OpenXR间接链接、API层总体排序、加载器设计

OpenXR间接链接 通过加载器间接链接,应用程序动态生成OpenXR命令调度表。如果找不到加载器,或者只有比应用程序更旧的API,则此方法允许应用程序正常失败。为此,应用程序在加载器库上,使用特定平台的动态符号,查找(如dlsym())xrGetInstanceProcAddr命令的地址。一旦发…

OpenXR™加载器-设计、操作、调用链

OpenXR™加载器-设计和操作 1.2.1概述 OpenXR是一个分层体系结构,由以下元素组成: 1)OpenXR应用程序 2)OpenXR加载程序 3)OpenXR API层 4)OpenXR运行时间 一般概念适用于Windows和Linux的系统的加载程序。 首先,让把OpenXR环境看作一个整体。OpenXR应用程序位于执行链的…

经典专著《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》4本书推荐

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

使用format_obproxy_digest_log工具分析obproxy网络层耗时SQL

之前写过一个博客,介绍 ob_tools包 来实施抓取 observer 层的 gv$ob_sql_audit 的SQL,还提供一些分析SQL来通过不同维度分析缓慢的业务SQL语句,免得和应用扯皮说数据库执行SQL慢。 但是分析出服务端业务SQL语句执行时间还不够,应用也有可能会和你扯皮说obproxy转发慢,也不…

win 安装Android子系统WSA

win 安装Android子系统WSA 仅适用于Windows10和11。 在WSA中,对于要运行的应用不能保证较好的Android兼容性。 1.启用虚拟机平台功能 启用虚拟机平台: PS C:\Users\xxx> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启计…

Windows环境配置Nginx服务实现负载均衡

系统环境:win10 测试服务:.net6.0+webapi 一、本地创建一个webapi项目二、新建一个api控制器,里面编写一个测试方法三、我直接把这一个项目复制了3份,然后修改控制器方法中的返回值分别为value01,value02,value03四、分别启动三个程序,并且配置不同的端口号Postman/Apif…