数据结构思维题选做(长期更新)

news/2025/9/22 21:08:26/文章来源:https://www.cnblogs.com/Ydoc770/p/19088541

到处乱找的. 用到的数据结构在 NOIP 考纲内,主要是学习、锻炼各种处理思路. 代码的实现都不算困难.

倍增思想

P10198 [USACO24FEB] Infinite Adventure P

Hint:跳的步数明显提示倍增. 根据 \(\sum T_i\) 的限制直接预处理是三只 \(\log\) 的,考虑怎样优化到两只 \(\log\).

的确是非常深刻的倍增题.

\(f_{u,k,t}\) 表示在日期 \(\bmod T_u=t\)\(u\) 开始\(2^k\) 步到达的节点. 但是这样直接做正确性无法保证,因为可能跳到 $ T_v>T_u$ 的节点 \(v\),这时我们就无法继续倍增了. 根据 \(\sum T_i\le10^5\) 以及 \(T_i\)\(2\) 的幂,令 \(V=\sum T_i\),所以只存在 \(O(\log V)\) 种不同的 \(T_i\). 于是我们令出现上述情况时 \(u\) 停在 \(v\) 不再继续跳,回答单次询问就是 \(O(\log V\log\Delta)\) 的. 由于预处理要对每种 \(T_i\) 都做一遍,所以总复杂度是 \(O(V\log^2V\log \Delta+q\log V\log\Delta)\) 的.

上述的预处理方法实际上有大量冗余的部分,如果跳到一个 \(T_v<T_u\) 的节点那么我们会丢失 \(u\) 的信息,之后再扩大 \(T_u\) 范围时间复杂度很劣. 因为 \(T_u\) 本身其实可以记录所有 \(\le T_u\) 的状态,所以我们可以通过修改倍增状态 \(f_{u,k,t}\) 的定义为\(2^k\)\(T_v=T_u\) 的节点后到达的点,此时转移就需要额外记录跳的步数 \(d_{u,k,t}\). 我们仍然强制让 \(f\) 停在第一个 \(T_v>T_u\)\(v\),就可以先通过每次跳极大的步数来用 \(O(\log V)\) 的时间找到第一个 \(T_v\ge T_u\) 的点作为 \(f_{u,0,t}\),并记下当前花的步数 \(d_{u,0,t}\),就可以倍增转移了. 这样大大优化了预处理的复杂度,总时间复杂度变为 \(O(V(\log V+\log \Delta)+q\log V\log\Delta)\).

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 1e5 + 10; const ll inff = 2e18;
int n, q, a[maxn];vector<int> b[maxn], f[maxn][70];
vector<ll> d[maxn][70];void init() {for(int s = 1; s < maxn; s <<= 1) {for(int u = 1; u <= n; u++) if(a[u] == s) {for(int i = 0; i < s; i++) {int v = b[u][i]; ll t = 1;while(a[v] < s && t < inff) {ll w = f[v][60][(i + t) % a[v]];t += d[v][60][(i + t) % a[v]], v = w;}f[u][0][i] = v, d[u][0][i] = min(t, inff);}}for(int k = 1; k <= 60; k++) for(int u = 1; u <= n; u++) if(a[u] == s) {for(int i = 0; i < s; i++) {int v = f[u][k - 1][i]; ll t = d[u][k - 1][i];if(a[v] == s) {f[u][k][i] = f[v][k - 1][(i + t) % s];d[u][k][i] = min(d[v][k - 1][(i + t) % s] + t, inff);}else f[u][k][i] = v, d[u][k][i] = t;}}}
}int main() {ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0);cin >> n >> q;for(int i = 1; i <= n; i++) cin >> a[i];for(int i = 1; i <= n; i++) {b[i].resize(a[i]);for(int &p : b[i]) cin >> p;for(int k = 0; k <= 60; k++) d[i][k].resize(a[i]), f[i][k].resize(a[i]);}init();while(q--) {int u; ll cur, dis;cin >> u >> cur >> dis;while(dis) {for(int k = 60; ~k; k--) if(dis >= d[u][k][cur % a[u]]) {int v = f[u][k][cur % a[u]]; ll t = d[u][k][cur % a[u]];if(a[v] != a[u]) k = 61;dis -= t, cur += t, u = v;}if(dis) u = b[u][cur % a[u]], dis--, cur++;}cout << u << endl;}return 0;
}

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

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

相关文章

龙泉公路建设投资有限公司网站网站到期怎么续费

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

网站建设宣传视频教程河北移动端网站制作

1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

陕西省建设监理协会网站证件查询什么是网络营销产生的技术原因

Swift 可选(Optionals)类型 Swift 的可选&#xff08;Optional&#xff09;类型&#xff0c;用于处理值缺失的情况。可选表示"那儿有一个值&#xff0c;并且它等于 x "或者"那儿没有值"。 Swfit语言定义后缀&#xff1f;作为命名类型Optional的简写&…

cdn网站加速如何免费创建自己的小程序

说明 在大量数据处理任务下的缓存与分发 这个算是来自顾同学的助攻1&#xff0c;我有点java绝缘体的体质&#xff0c;碰到和java相关的安装部署总会碰到点奇怪的问题&#xff0c;不过现在已经搞定了。测试也接近了kafka官方标称的性能。考虑到网络、消息的大小等因素&#xff0…

网站建设初稿哪家建站好

初始标记 需要暂停所有的其他线程&#xff0c;但这个阶段会很快完成。它的目的是标记所有的根对象&#xff0c;以及被根对象直接引用的对象&#xff0c;以及年轻代指向老年代的对象&#xff0c;不会遍历对象关系&#xff0c;单线程执行。 并发标记阶段 不需要暂停应用线程&a…

营销型网站建设和规划lnmp下安装wordpress

文章目录 四、流程控制语句4.1 选择结构4.1.1 if语句 4.1.2 三目运算符4.1.3 switch语句注意事项 4.1.4 if和switch的区别【CHAT】4.2 循环结构4.2.1 while循环语句4.2.2 do...while循环语句 4.2.3 for循环语句九九乘法表 4.3 跳转语句4.3.1 break语句4.3.2 continue语句4.3.3 …

政治笔记/错题

生产力:是指人们改造自然,使之适应人的需要的物质力量,标志着人类改造自然的实际能力和水平。 生产关系:生产力诸要素相结合的社会形式,指的是人们在物质生产和再生产过程中所形成的经济关系,它是由生产资料所有…

9.22模拟赛总结

赛时 模拟赛 赛时记录: 剩余时间2:33开始打T2 剩余时间1:32开始打完T2 剩余时间1:00结束T2 剩余时间0:30T4有思路,开始打 时间到了放弃T4 赛时状态: T1怎么看起来好复杂,完全没有顺序和思路 T2回文串,每个位置…

莫队 n的序列,多次查询一段区间内的数字的个数

莫队 n的序列,多次查询一段区间内的数字的个数 // 普通莫队 O(n*sqrt(n)) include include include include using namespace std; const int N=50005; int n,m,k,B,a[N]; int sum,c[N],ans[N]; struct Q{ int l,…

巴州建设局网站网站建设与app开发

任务一&#xff1a;挖掘反射型XSS漏洞&#xff08;以弹窗test13&#xff09;证明 任务二&#xff1a;复现环境中的CSRF漏洞&#xff0c;设计表单&#xff0c;当管理员点击URL后自动将自己密码重置为&#xff1a;123456 任务三&#xff1a;复现环境中的JSON Hijacking漏洞&#…

免费发布推广的网站wordpress页面几层

https://support.huawei.com/enterprise/zh/doc/EDOC1100325140/f6eeacd6 打开链接&#xff0c;里面的内容很详细。

建设银行官方网站个人深圳市建设交易中心官网

应用场景 有的时候&#xff0c;我们对于同一通道中的消息处理&#xff0c;会通过判断头信息或者消息内容来做一些差异化处理&#xff0c;比如&#xff1a;可能在消息头信息中带入消息版本号&#xff0c;然后通过if判断来执行不同的处理逻辑&#xff0c;其代码结构可能是这样的…

杭州网站运营国外排版网站

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

查企企官方网站品牌推广公司排行榜

作者简介 多肉&#xff0c;饿了么资深python工程师。曾在17年担任饿了么即时配送众包系统的研发经理&#xff0c;这篇文章最早的版本就诞生于那段时间&#xff0c;目前负责配送相关业务系统的整体稳定性建设。个人比较喜欢c和python&#xff0c;最近有点迷rust&#xff0c;同时…

专业集团网站建设小程序app怎么做

目录 uni-app介绍 uni-app开发工具HBuilderX 创建项目前提条件 uni-app项目结构 配置mumu模拟器 uni-app生命周期 1.应用生命周期 小程序规范 2.页面生命周期-小程序规范 3.组件生命周期 vue规范 uni-app登录按钮方法 uni-app发布安卓app uni-app介绍 uni-app 是一个…

南通网站建设果尔浙江网站建设dyfwzx

文章目录 前言声明一、漏洞描述二、漏洞分析三、漏洞复现四、修复建议前言 泛微e-office OfficeServer2.php 存在任意文件读取漏洞,攻击者可通过构造特定Payload获取敏感数据信息。 声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造…

商业网站的建设与维护wordpress用redis

排序 排序的概念常见的排序算法常见排序算法的实现数组的打印 插入排序直接插入排序的实现希尔排序( 缩小增量排序 )希尔排序的实现 交换排序冒泡排序冒泡排序的实现选择排序选择排序的实现堆排序堆排序的实现快速排序快速排序非递归 归并排序归并排序的递归实现归并排序的非递…

【mysql】mysql客户端中文显示乱码

背景 最近在做数据库还原的时候,由于备份的sql中存在中文,导致还原的时候,出现乱码;深受毒害 解决 修改 MySQL 配置文件 my.cnf或 my.ini​ 在 ​MySQL 配置文件​(通常位于 /etc/my.cnf、/etc/mysql/my.cnf或 ~/…

很烦不知道 自己以后要做什么,工作不会很稳定。感觉有很多东西要学习 但是 也有很多东西 不会 不知道咋办了

很烦不知道 自己以后要做什么,工作不会很稳定。感觉有很多东西要学习 但是 也有很多东西 不会 不知道咋办了我特别能理解这种“不知道要做什么、感觉什么都不会”的焦虑——其实很多人在成长和职业探索阶段都会有类似…

揭秘“牛牛透视”

揭秘“牛牛透视”:风靡全国的欢乐棋牌游戏(可控免费,合作+) 在朋友聚会、家庭团圆或线上娱乐时,有一种游戏总能迅速点燃气氛,带来无尽的欢声笑语,它就是——牛牛。这款规则简单、节奏明快、充满刺激感的扑克游戏…