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

协调串

题目描述

数轴上有 \(n\) 个点正在进行周期性的往返运动。

\(i\) 个点 \((1 \le i \le n)\) 的运动区间是 \([x_i, x_i + L]\)。所有点的运动区间长度相同,均为 \(L\)

在第 \(0\) 秒时:

  • \(c_i = 0\),则第 \(i\) 个点位于 \(x_i\),且其初始运动方向向右;
  • \(c_i = 1\),则第 \(i\) 个点位于 \(x_i + L\),且其初始运动方向向左。

所有的点每秒移动 \(1\) 个单位长度。当任意一个点到达其运动区间的端点时,它会立刻调头反向移动。

现在有 \(q\) 个询问,每个询问给出时间 \(t\) 和一个整数 \(k\),请你求出在第 \(t\) 秒时,所有点当前位置中的第 \(k\) 小值。

样例

样例输入 #1

5 4 10
0 0
7 0
3 1
12 1
20 0
0 3
3 2
12 4
20 5

样例输出 #1

13
10
15
22

样例解释 #1

对于各个询问:

  • \(t = 0, k = 3\):此时各点位置为 \(0, 7, 13, 22, 20\)。从小到大排序为 \(0, 7, 13, 20, 22\),第 \(3\) 小值为 \(13\)
  • \(t = 3, k = 2\):此时各点位置为 \(3, 10, 10, 19, 23\)。从小到大排序为 \(3, 10, 10, 19, 23\),第 \(2\) 小值为 \(10\)
  • \(t = 12, k = 4\):此时各点位置为 \(8, 15, 5, 14, 28\)。从小到大排序为 \(5, 8, 14, 15, 28\),第 \(4\) 小值为 \(15\)
  • \(t = 20, k = 5\):运动周期为 \(2L = 20\) 秒,此时所有点回到了第 \(0\) 秒的位置,即 \(0, 7, 13, 22, 20\)。从小到大排序后,第 \(5\) 小值为 \(22\)

数据规模

注意:你只有通过了子任务的所有测试点,才能获得对应子任务的分数。

子任务编号 分数 \(n, q \le\) \(L \le\) \(t_j \le\)
1 40 \(2000\) \(2000\) \(2000\)
2 60 \(2 \times 10^5\) \(10^9\) \(10^{18}\)

对于 \(100\%\) 的数据:

  • \(1 \le n, q \le 2 \times 10^5\)
  • \(1 \le L \le 10^9\)
  • \(0 \le x_i \le 10^9\)
  • \(c_i \in \{0, 1\}\)
  • \(0 \le t_j \le 10^{18}\)
  • \(1 \le k_j \le n\)

Subtask 1

对于 \(n,q \le 2000\) ,可接受 \(O(nq)\) ,对每个位置进行暴力模拟,排序输出第 \(k\) 小即可

Subtask 2

由于每个点的速度及区间长度都相同,仅有初始位置及运动方向不同,不难看出同一运动方向上的点的相对位置不变。
对于任意一个位置,经过 \(t\) 秒后,设其为从小到大第 \(i\) 个点,其左侧位置一定为第 \(i-1\) 个点,右侧一定为第 \(i+1\) 个点,考虑二分。
题目要求输出第 \(k\) 个点的位置,对位置进行二分答案。
对于每一个位置,查找 \(t\) 秒后其是否为第 \(k\) 个点,点的类型可分为往左和往右两种类型,若该位置前方往左和往右的点的和等于 \(k\),则该点为最终答案。

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N = 2e5+5;struct P {int x,c;
};int n,q,L;
P le[N],ri[N];
int sl,sr;inline int get_left_sum(ll val, ll t) {ll dt = (t<=L)?-t:(t-2*L); ll ans=0; int l=1,r=sl;while(l<=r) {int mid = (l+r)/2;if(le[mid].x<=val-dt) l=mid+1,ans=mid;else r=mid-1;}return ans;
}inline int get_right_sum(ll val, ll t) {ll dt = (t<=L)?t:(2*L-t); ll ans=0;int l=1,r=sr;while(l<=r) {int mid = (l+r)/2;if(ri[mid].x<=val-dt) l=mid+1,ans=mid;else r=mid-1;}return ans;
}bool cmp(P p1,P p2) {return p1.x<p2.x;
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>q>>L;for(int i=1;i<=n;i++) {int x,c; cin>>x>>c;if(c==0) ri[++sr]={x,c};else le[++sl]={x+L,c};}sort(ri+1,ri+1+sr,cmp);sort(le+1,le+1+sl,cmp);while(q--) {ll t,k; cin>>t>>k; t%=2*L;ll l=-2e18,r=2e18;ll ans=-1;while(l<=r) {ll mid = l+(r-l)/2;ll sum = get_left_sum(mid,t) + get_right_sum(mid,t);if(sum>=k) r=mid-1,ans=mid;else l=mid+1;}cout<<ans<<endl;}return 0;
}
http://www.jsqmd.com/news/1352751/

相关文章:

  • ArcGIS视域分析实战:从原理到参数设置与结果解读
  • 重塑Flash时代:CefFlashBrowser如何让经典内容重获新生
  • 从零构建像素沙盒数字孪生系统:技术原理与实践指南
  • 扩展Kawaii-Player功能:插件安装与自定义脚本编写指南
  • 突破窗口限制:3分钟学会用Window Resizer掌控任意软件界面
  • Vue3-Treeselect:轻松构建层级数据选择界面的实用解决方案
  • 从零构建实用AI智能体:核心架构、实战与避坑指南
  • Navicat密码解密工具:3分钟找回丢失数据库密码的完整指南
  • C++状态模式解析:游戏开发与网络编程实战
  • Ubuntu 20.04双系统安装与卸载全流程详解:从启动盘制作到分区引导
  • Diablo Edit2:暗黑破坏神2存档二进制数据结构深度解析与架构重构
  • ADS1248/1247高精度ADC配置实战:从硬件连接到软件调试全解析
  • 5大创新设计:D3KeyHelper如何重塑暗黑3自动化操作体验
  • Windows运行库的终极解决方案:VisualCppRedist AIO深度解析
  • 2026、8 月扬州彩钢瓦、金属屋面、钢结构,防水防腐、出新、除锈、喷漆、修缮 ** 推荐 + 避坑指南 - 万至防水
  • C语言结构体与Java类的内存模型对比:从值语义到引用语义的本质差异
  • 终极指南:如何使用bilibili-parse轻松获取B站视频直链
  • 2624张光伏缺陷检测数据集:让AI看懂太阳能电池的健康状况 [特殊字符]
  • 3步快速定位Windows热键冲突:Hotkey Detective完整使用指南
  • 工业物联网边缘网关终极指南:ThingsGateway完整安装与配置教程
  • 中级——新版日期类
  • Maven本地仓库配置与IDEA全局设置详解:提升Java开发效率
  • 完整、集成度高的 `MainViewModel` 代码,配当前的所有架构(Prism + CommunityToolkit.Mvvm + 多站点 + 实时数据 + 波形)
  • MobileViT:移动端轻量级视觉Transformer模型的设计与部署实战
  • 5分钟解决Windows 11老游戏兼容问题:DDrawCompat终极指南
  • Vue 3 中文文档完全指南:从零基础到项目实战的权威教程
  • UE5.5 TMeshAABBTree3:高性能空间查询加速结构深度解析
  • CAN FD与经典CAN网络共存:网关策略与实战部署指南
  • PCL2整合包制作完全指南:从零到一的Minecraft配置分享方案
  • Lenovo Legion Toolkit终极指南:解锁联想拯救者笔记本全部潜力