[NOIP2017 提高组] 列队 题解

news/2024/11/8 22:36:15/

数据结构。

n = 1 n=1 n=1 的 case:考虑有 m + q m+q m+q 个位置,出队的人直接添加到队尾。维护位置对应的人,每次查询第 k k k 个人的位置。

实现考虑维护 01 序列,表示位置上是 / 否有人,每次查前缀和为 k k k 的位置即可。

一般情况:每次操作只会影响某一行以及最后一列。考虑将最后一列单独处理。

对于查询 ( x , y ) (x,y) (x,y):需查询第 x x x 行第 y y y 个人的位置以及最后一列第 x x x 个人的位置,维护一下对应编号, y = m y = m y=m 时只用查最后一列。

实现考虑离线树状树组或动态开点线段树,线段树 / 树状树组上二分可以做到 log ⁡ \log log,总时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

树状树组实现显然要离线,仅用一个 BIT 预处理每次非最后一列操作在对应行的位置。

#include<bits/stdc++.h>
#define int long long
using namespace std;const int N = 3e5 + 5; 
const int V = 6e5;int n, m, q, tree[N<<1], x[N], y[N], num[N];int lowbit(int x) {return x&(-x);}
void add(int x, int d){for(;x <= V; x += lowbit(x)) tree[x] += d;}
int select(int k)
{int pos = 0, sum = 0;for(int i=20; i>=0; i--){pos += (1 << i);if(pos > V or sum + tree[pos] >= k) pos -= (1 << i);else sum += tree[pos];}return pos + 1;
}signed main()
{ios::sync_with_stdio(0); cin.tie(0);cin >> n >> m >> q;for(int i=1; i<=V; i++) tree[i] = lowbit(i);vector <vector<int>> cmd(n+1);for(int i=1; i<=q; i++){cin >> x[i] >> y[i];if(y[i] != m) cmd[x[i]].push_back(i);}for(int i=1; i<=n; i++){for(auto id : cmd[i])num[id] = select(y[id]), add(num[id], -1);for(auto id : cmd[i]) add(num[id], 1);}vector <vector<int>> row(n+1);vector <int> column;for(int i=1; i<=q; i++){int in, out, p = select(x[i]); add(p, -1);if(y[i] != m){out = (num[i] < m) ? ((x[i]-1)*m+num[i]) : row[x[i]][num[i]-m], in = (p <= n) ? (p*m) : column[p-n-1];row[x[i]].push_back(in), column.push_back(out);}else{out = (p <= n) ? (p*m) : column[p-n-1];column.push_back(out);}cout << out << "\n";	}
}

http://www.ppmy.cn/news/1195538.html

相关文章

基于51单片机电子秤-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;HX711模块&#xff0c;按键设置单价&#xff0c;计算总价&#xff0c;超量程报警&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 I…

怎样做好金融投资翻译

我们知道&#xff0c; 金融投资翻译所需的译文往往是会议文献、年终报表、信贷审批等重要企业金融资料&#xff0c;其准确性事关整个企业在今后一段时期内的发展战略与经营成效。尤其像年报&#xff0c;对于上市公司来说更是至关重要的。那么&#xff0c;怎样做好金融投资翻译&…

精品基于Python的气象预报系统-爬虫

《[含文档PPT源码等]精品基于Python的气象预报系统-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff…

学习编程语言需要具备哪些数学基础?

学习编程语言需要具备的数学基础是一个非常广泛和深入的话题。 在计算机科学和软件工程领域&#xff0c;数学与编程语言密不可分&#xff0c;其中包括离散数学、统计学、算法分析等领域。 这里将从以下四个方面详细论述学习编程语言需要具备的数学基础&#xff1a;基本数学知…

(论文阅读14/100)End-to-end people detection in crowded scenes

文献阅读笔记 简介 题目 End-to-end people detection in crowded scenes 作者 Russell Stewart, Mykhaylo Andriluka 原文链接 https://arxiv.org/pdf/1506.04878.pdf 关键词 Null 研究问题 当前的人员检测器要么以滑动窗口的方式扫描图像&#xff0c;要么对一组离…

【JVM经典面试题(五十二道)】

文章目录 JVM经典面试题&#xff08;五十二道&#xff09;引言1.什么是JVM 内存管理2.能说一下JVM的内存区域吗&#xff1f;3.说一下JDK1.6、1.7、1.8内存区域的变化&#xff1f;4.为什么使用元空间替代永久代作为方法区的实现&#xff1f;5.对象创建的过程了解吗&#xff1f;6…

后端nginx报reset by peer while reading upstream

目录 1 解决 1 解决 加大nginx请求体或者nginx缓存 或者浏览器读取json大小设置成—1

海康Visionmaster调试脚本:对脚本进行调试的方法

第一步&#xff0c;在脚本模块中使用导出工程功能&#xff0c;将模块中的代码导出 第二步&#xff0c;找到导出的工程&#xff0c;并打开 第三步&#xff0c;生成解决方案&#xff0c;设置断点&#xff0c;点击 VS 菜单调试中的附加到进程&#xff0c;选择 ShellModuleManage…