当前位置: 首页 > news >正文

#题解#洛谷 P3509 ZAB-Forg#滑动窗口#快速幂#

P3509 [POI 2010] ZAB-Frog - 洛谷

分析

  1. p[i]数组给定:预处理nxt[i]为距离p[i]第k近的序号。

  2. nxt[i]的预处理:显然,nxt[i]是包含 i 的长度为k+1的子区间的权较大端点中的权最小的点。

考虑滑动窗口维护。

  1. 跳跃m步的查询:m范围很大,我们用类似快速幂的方法查询,将复杂度降至O(log m)。

代码分析

#include<bits/stdc++.h>
#define int  long long
#define endl '\n'
using namespace std;
const int N = 1e6+10;int n, k, m;
int p[N];
int r[N];
int tmp[N];
int nxt[N];
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> k >> m;for (int i = 1; i <= n; i++)cin >> p[i], r[i] = i;int head = 1;int tail = k + 1;for (int i = 1; i <= n; i++){while (tail + 1 <= n && p[tail + 1] - p[i] < p[i] - p[head]) head++, tail++;if (p[tail] - p[i] > p[i] - p[head]) nxt[i] = tail;else nxt[i] = head;}//	for(int i=1;i<=n;i++)
//		cout<<nxt[i]<<" ";
//	cout<<endl;for (int mm = m; mm; mm >>= 1){if (mm & 1)for (int i = 1; i <= n; i++)r[i] = nxt[r[i]];for (int i = 1; i <= n; i++)tmp[i] = nxt[nxt[i]];for (int i = 1; i <= n; i++)nxt[i] = tmp[i];}for (int i = 1; i <= n; i++)cout << r[i] << " ";return 0;
}
http://www.jsqmd.com/news/73060/

相关文章:

  • Java安全之反射入门学习
  • 四种高效的Obsidian标签体系构建,实战演示教程附模板
  • 深入解析:UART、IIC、SPI、CAN通信协议简介
  • C++性能优化必知:CPU缓存与伪共享避免实战指南
  • Java入门之SpEL表达式注入入门学习
  • [NOI2014] 购票
  • 解码IPC-管道与信号 - 指南
  • 软件工程学习日子2025.12.11
  • 12月11号
  • 4
  • 阅读笔记六:编码与重构
  • 12月10号
  • 大夏龙雀DX-WF25(ESP32-C2-H2) mixly开发
  • 线段树
  • C++多线程性能优化实战:从互斥锁到无锁编程完全指南
  • Airflow - override()
  • React zustand todos案例(带本地存储localStorage、persist)todoStore.ts - 详解
  • SpringBoot 如何构建零拷贝:深度解析零拷贝科技
  • SpringBoot 如何构建零拷贝:深度解析零拷贝科技
  • MySQL基础语法复习笔记(含完整代码示例+新手实操指南) - 教程
  • Thinkphp6---关联查询
  • Unity 游戏启动器
  • Day28综合案例--双开门
  • Swift-Prometheus 库因指标名称与标签未净化导致的指标劫持漏洞详解
  • 一种融合身份证识别与炫彩活体检测而生的人脸核身技术,实现无感身份强认证
  • c++实验五
  • Linux命令记录
  • useradd、usermod、userdel命令详解
  • PRD太难写?AI生成的产品需求文档,到底能不能用?
  • 无监督通用流数据异常检测新方法SEAD