题目大意

构造一个分段函数来拟合若干点(\(x_i , y_i\)),每一段是一个常函数,即

\[f(x)=
\left \{
\begin{aligned}
a_1& & (0\leq x <b_1) \\
a_2& & (b_1\leq x <b_2) \\
&......& \\
a_m& & (b_{m-1} \le x)
\end{aligned}
\right.
\]

误差的定义为

\[E=\max_{1\leq i\leq n} |f(x_i)-y_i|
\]

最小化误差,\(k\)次询问

输入格式

第一行为一个整数\(n\)

后面\(n\)行每行两个自然数,\(x_i,y_i\)

下一行为一个整数\(k\)

后面\(k\)行每行一个正整数\(m_i\)

输出格式

\(k\)行,每行一个整数表示金光第i个询问的答案

\(tips\): 输出可能不为整数

输入样例 #1

2

1 2

5 5

1

1

输出样例 #1

1.5

输入样例 #2

4

1 8

2 19

3 8

4 12

2

2

3

输出样例 #2

5.5

2

输入样例 #3

10

344 9026

762 1512

1463 2024

1688 7200

3832 4384

7225 3868

9048 2158

9706 6899

9812 1720

9851 8398

3

3

1

6

输出样例 #3

2844

3757

2370.5

说明

\(1\leq n\leq 10^6\)

\(0\leq x_i,y_i\leq 10^9,x_i < x_{i+1}\)

\(\sum m\leq 2\times 10^4\)

若V表示值域,每组数据\(n,k,V,\sum m\)小于等于以下值

\[\begin{aligned}
&N\!o.& & n & & k & &V & & \sum m \\
&1&& 10 & & 1 & &100 & & 1\\
&2&& 10 & & 1 & &100 & & 3 \\
&3&& 10 & & 3 & &10^4 & & 10 \\
&4&& 100 & & 1 & &10^5 & & 1 \\
&5&& 100 & & 1 & &10^5 & & 10 \\
&6&& 100 & & 10 && 10^5 & & 100 \\
&7&& 100 && 10 && 10^9& & 100 \\
&8&& 10^4 && 1 && 10^5 && 1 \\
&9&& 10^4 && 1 && 10^5 && 100 \\
&10&& 10^4 && 10 && 10^9& & 100 \\
&11&& 10^5 & &20 && 10^9 && 1000 \\
&12&& 10^5 && 100 && 10^9 && 10^4 \\
&13&& 10^6 && 1 && 10^9 && 1 \\
&14&& 10^6 & &1 & &10^9 & &100 \\
&15&& 10^6 && 10 && 10^9 && 100 \\
&16&& 10^6 && 10 && 10^9 && 2\times 10^4 \\
&17&& 10^6 && 200 && 10^9 && 2\times 10^4 \\
&18&& 10^6 && 200 && 10^9 && 2\times 10^4 \\
&19&& 10^6 && 200 && 10^9 && 2\times 10^4 \\
&20&& 10^6 && 200 && 10^9 && 2\times 10^4 \\
\end{aligned}\]

代码

#include<cstdio>
#include<iostream>
using namespace std; const int N = 1e6;
int n , y[N + 5] , m , k , Min[N + 5][23] , Max[N + 5][23] , ans; inline void prepare()
{
for(register int j = 1; (1 << j) <= n; j++)
for(register int i = 1; i + (1 << j) - 1 <= n; i++)
{
Min[i][j] = min(Min[i][j - 1] , Min[i + (1 << j - 1)][j - 1]);
Max[i][j] = max(Max[i][j - 1] , Max[i + (1 << j - 1)][j - 1]);
}
} inline bool check(int mid , int m)
{
int l = 1;
for(register int i = 1; i <= m && l <= n; i++)
{
int r = l , smin = y[l] , smax = y[l];
for(register int j = 22;j >= 0; j--)
if (r + (1 << j) <= n)
{
int tmin = Min[r + 1][j] , tmax = Max[r + 1][j];
if (max(smax , tmax) - min(smin , tmin) <= mid)
{
r += (1 << j);
smax = max(smax , tmax);
smin = min(smin , tmin);
}
}
l = r + 1;
}
return l > n;
} inline int work(int m)
{
int res , l = 0 , r = 1e9 , mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid , m)) res = mid , r = mid - 1;
else l = mid + 1;
}
return res;
} int main()
{
// freopen("a.in" , "r" , stdin);
scanf("%d" , &n);
for(register int i = 1; i <= n; i++)
{
scanf("%*d%d" , &y[i]);
Min[i][0] = Max[i][0] = y[i];
}
prepare();
scanf("%d" , &k);
while (k--)
{
scanf("%d" , &m);
ans = work(m);
if (ans & 1) printf("%.1lf\n" , ans * 1.0 / 2);
else printf("%d\n" , ans / 2);
}
}

最新文章

  1. Android中webView和网页的交互
  2. C#使用ADO.NET访问数据库(一)
  3. 如何把Qlik Sense嵌入到Web应用中
  4. Appirater -- app中提示用户为app评价的提示框
  5. 使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - &quot;Failed to connect to 2001:da8:8000:6023::230: 网络不可达&quot;
  6. angularJs的工具方法
  7. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON TestObjDef
  8. thinkphp 初始配置
  9. HDU 5387 Clock
  10. cgi创建web应用(一)之传递表单数据与返回html
  11. Android 去除list集合中重复项的几种方法
  12. ###Android 断点调试和高级调试###
  13. Android 特殊符号的转码大全
  14. chapter 13_0 元方法
  15. Python中的那些“坑”
  16. Puppeteer: 更友好的 Headless Chrome Node API
  17. chrome 和IE 上传的文件,在net 后台取值Request.Form.Files[0].FileName 的不同
  18. python之高阶函数
  19. postman中 form-data、x-www-form-urlencoded、raw、binary的区别--转
  20. linux命令注解

热门文章

  1. 视频超分之BasicVSR-阅读笔记
  2. 在实际应用中联合体union的妙用
  3. SpringMVC02:返回值、json数据、文件上传、拦截器
  4. angr_ctf——从0学习angr(二):状态操作和约束求解
  5. 纷繁复杂见真章,华为云产品需求管理利器CodeArts Req解读
  6. tcp/udp 协议特性和三次握手
  7. MySQL主从配置(Django实现主从配置读写分离)
  8. js 获取当前时间转换时间戳 (毫秒)
  9. 用python 协程 爬百度小说西游记
  10. 【转载】EXCEL VBA 20个有用的ExcelVBA代码