延迟观测的时间缓存插值
题目
对严格递增时间戳缓存做分段线性插值: 端点可查询,超出范围输出 OUT,禁止外推。本题只做观测对齐,不等同于完整乱序 Kalman 回滚重放。
输入
;随后 行 ;然后 个查询时间。,时间严格递增。
输出
每个查询一行:插值值或 OUT。
示例
输入
5 17
0 4.482117543855827
1 5.14174801512263
2 3.586444563099697
4 -6.00496539724935
7 0.46940689223143295
-1 0 0.5 1 3 7 8 4.654154960359032 7.364342451183196 5.9666563355976345 2.7141423791139596 3.630301257255457 4.726626994825972 8.992187208189469 3.0621420149073186 -0.609351789316992 5.505867656189043
期望输出
OUT
4.482117543855827
4.811932779489228
5.14174801512263
-1.2092604170748267
0.46940689223143295
OUT
-4.59321781445771
OUT
-1.760676969874302
0.161628399029198
-4.231999295505086
-4.436814170552693
OUT
-1.507275187443934
OUT
-2.7551161222974456
在线 C++17 练习
在浏览器编译运行,代码不上传;首次下载约 28 MB。
尚未运行
运行环境
Clang 22 / C++17 / WASI,支持本题所需标准库;不支持线程、C++ 异常或任意宿主系统访问。每例 2 秒、256 MiB 线性内存、64 KiB 输出;编译器另占浏览器内存,不适合低内存设备。初次加载最多等待 120 秒,可随时停止。
草稿保存在本浏览器。测试公开,属于本地自测而非防作弊竞赛判题;参考解答不参与运行。所有运行资产均由本站提供。
编译器来源与开源许可参考实现(完成后再展开)
对照自己的推导,检查状态更新顺序、边界条件与单位,而不只比较最终输出。
#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <vector>
#include <array>
#include <queue>
#include <tuple>
#include <limits>
using namespace std;
// Reference implementation: optional; solve the starter before opening.
int main() {
cout << setprecision(17);
int n,m;
cin>>n>>m;
vector<double>t(n),x(n);
for(int i=0;i<n;i++)cin>>t[i]>>x[i];
while(m--) {
double q;
cin>>q;
if(q<t.front()||q>t.back()) {
cout<<"OUT\n";
continue;
}
int i=lower_bound(t.begin(),t.end(),q)-t.begin();
if(i==0) {
cout<<x[0]<<"\n";
continue;
}
cout<<x[i-1]+(x[i]-x[i-1])*(q-t[i-1])/(t[i]-t[i-1])<<"\n";
}
}