UOJ#206. 【APIO2016】Gap(交互,乱搞)
有 NN 个严格递增的非负整数 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<⋯<aN≤10180≤a1<a2<⋯<aN≤1018)。你需要找出 ai+1−aiai+1−ai(0≤i≤N−10≤i≤N−1)里的最大的值。
你的程序不能直接读入这个整数序列,但是你可以通过给定的函数来查询该序列的信息。关于查询函数的细节,请根据你所使用的语言,参考下面的实现细节部分。
你需要实现一个函数,该函数返回 ai+1−aiai+1−ai(0≤i≤N−10≤i≤N−1)中的最大值。
实现细节
本题只支持 C/C++/Pascal。
C/C++
你需要包含头文件 gap.h。
你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 long long 类型的整数:
- TT:子任务的编号(11 或者 22)
- NN:序列的长度
你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, &mn, &mx),该函数的前两个参数 ss 和 tt 是 long long 类型的整数,后两个参数 &mn 和 &mx 是 long long 类型的整数的指针(mn 和 mx 是 long long 类型的整数)。当 MinMax(s, t, &mn, &mx) 返回时,变量 mn 将会存储满足 ai∈[s,t]ai∈[s,t] 中 aiai 的最小值,变量 mx 将会存储满足 ai∈[s,t]ai∈[s,t],aiai 的最大值。如果区间 [s,t][s,t] 中没有序列中的数,则 mn 和 mx 都将存储 −1−1。在查询时需要满足 s≤ts≤t,否则程序将会终止,该测试点计为 00 分。
Pascal
你需要使用单元 graderhelperlib。
你需要实现一个函数 findGap(T, N),该函数接受下面的参数,并返回一个 Int64 类型的整数:
- TT:子任务的编号(11 或者 22)(Integer 类型)
- NN:序列的长度(LongInt 类型)
你的函数 findGap 可以调用系统提供的查询函数 MinMax(s, t, mn, mx),该函数的前两个参数 ss 和 tt 是 Int64 类型的整数,后两个参数 mn 和 mx 是传引用方式的 Int64 类型的整数(过程内部对这两个变量的修改会影响到外部的对应变量的值)。当 MinMax(s, t, mn, mx) 执行完毕时,变量 mn 将会存储满足 ai∈[s,t]ai∈[s,t] 中 aiai 的最小值,变量 mx 将会存储满足 ai∈[s,t]ai∈[s,t],aiai 的最大值。如果区间 [s,t][s,t] 中没有序列中的数,则 mn 和 mx 都将存储 −1−1。在查询时需要满足 s≤ts≤t,否则程序将会终止,该测试点计为 00 分。
样例一
C/C++
考虑 N=4,a1=2,a2=3,a3=6,a4=8N=4,a1=2,a2=3,a3=6,a4=8。
则答案应该是 33,可以通过下面的几组对 MinMax 的询问获得:
- 调用 MinMax(1, 2, &mn, &mx),则 mn 和 mx 皆返回 22。
- 调用 MinMax(3, 7, &mn, &mx),则 mn 返回 33,mx 返回 66。
- 调用 MinMax(8, 9, &mn, &mx),则 mn 和 mx 皆返回 88。
Pascal
考虑 N=4,a1=2,a2=3,a3=6,a4=8N=4,a1=2,a2=3,a3=6,a4=8。
则答案应该是 33,可以通过下面的几组对 MinMax 的询问获得:
- 调用 MinMax(1, 2, mn, mx),则 mn 和 mx 皆返回 22。
- 调用 MinMax(3, 7, mn, mx),则 mn 返回 33,mx 返回 66。
- 调用 MinMax(8, 9, mn, mx),则 mn 和 mx 皆返回 88。
样例评测方式
样例测评系统从标准输入中读入两行。第一行包含两个整数,子任务编号 TT,和序列长度 NN。第二行包含 NN 个严格递增的非负整数。然后该程序会向标准输出中写入两行,第一行为 findGap 的返回值,第二行为花费 MM 的值。
下面的输入描述了上面的样例:
2 4
2 3 6 8
限制与约定
对于所有的测试点,有 2≤N≤1000002≤N≤100000。
每一个测试点开始测试之前,MM 都将被初始化为 00。
子任务 1(30 分):每一次调用 MinMax 都将使 MM 加 11。为了获得所有分数,需要满足对于该子任务下的所有测试点,都有 M≤N+12M≤N+12。
子任务 2(70 分):定义 kk 为调用 MinMax 时,区间 [s,t][s,t] 中的序列中数的数量。每次调用 MinMax,将使 MM 加上 k+1k+1。对于每一个测试点,如果 M≤3NM≤3N,你将得到 70 分,否则将得到 60M/N+1√−160M/N+1−1 分。你的该子任务的得分是其下所有测试点中的最低分。
时间限制:1s1s
空间限制:256MB256MB
下载
人生中第一道交互
30分的做法比较简单(然而想了半个小时。。)。
每次询问两端的最大值,然后不断往中间缩,这样就能把原序列恢复出来
100分做法:
首先这一部分对询问次数没有限制,这样我们考虑从最小的点开始,慢慢询问
这里用到一个非常神奇的性质
对于最大值为$r$,最小值为$l$的区间,答案的最小值为$\frac{r-l}{N-1}$
考场上想不出来,不过看到之后觉得还是挺显然的
这样我们只需要关注长度大于它的区间就可以了,直接for循环往后推
#include "gap.h"
#include<queue>
#include<algorithm>
#define LL long long
const int MAXN = 1e6 + ;
LL a[MAXN];
long long findGap(int T, int N) {
if(T == ) {
LL l = , r = 1e22;
LL minn, maxn;
int now = ;
while(l <= r) {
MinMax(l + , r - , &minn, &maxn);
if(minn == maxn && minn != -) {a[++now] = minn;break;}
if(minn == -) break;
a[++now] = minn, a[N - now + ] = maxn;
if(now == (N + )/) break;
l = minn, r = maxn;
}
LL ans = ;
for(int i = ; i <= N; i++)
ans = std::max(ans, a[i] - a[i - ]);
return ans;
}
else {
LL l = , r = 1e22, last = -;
MinMax(l, r, &l, &r);
LL len = (r - l + N - ) / (N - );
if(N == ) return (r - l);
for(LL i = l; i <= r;) {
LL s = i, t = i + len;
MinMax(s, t, &s, &t); i += len + ;
if(last != - && s != -) len = std::max(len, s - last);
if(t != -) last = t;
}
return len;
}
}
UOJ#206. 【APIO2016】Gap(交互,乱搞)的更多相关文章
- 【uoj#209】[UER #6]票数统计 组合数+乱搞
题目描述 一个长度为 $n$ 的序列,每个位置为 $0$ 或 $1$ 两种.现在给出 $m$ 个限制条件,第 $i$ 个限制条件给出 $x_i$ .$y_i$ ,要求至少满足以下两个条件之一: 序列的 ...
- 【uoj#142】【UER #5】万圣节的南瓜灯 乱搞+并查集
题目描述 给出一张 $n\times m$ 的网格图,两个格子之间有一条双向边,当且仅当它们相邻,即在网格图中有一条公共边. 特殊地,对于 $1\le x\le n$ ,$(x,1)$ 和 $(x ...
- [APIO2016]Gap
题目:UOJ#206. 题目大意:由于过于冗长,不好解释,所以详见原题. 解题思路:这是一道交互题. 对于第一问,很容易解决.由于数列严格递增,所以不会出现相等的情况. 首先调用MinMax(0,10 ...
- 洛谷P5211 [ZJOI2017]字符串(线段树+乱搞)
题面 传送门 题解 为什么大佬们全都是乱搞的--莫非这就是传说中的暴力能进队,乱搞能AC-- 似乎有位大佬能有纯暴力+玄学优化\(AC\)(不算上\(uoj\)的\(Hack\)数据的话--这要是放到 ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞
2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 70 Solved: 24[Submit][Status][D ...
随机推荐
- Visualizing CNN Layer in Keras
CNN 权重可视化 How convolutional neural networks see the world An exploration of convnet filters with Ker ...
- apache ftp server的外网访问问题
apache ftp server的外网访问简单配置点如下:
- C#中的三种timer
转 https://blog.csdn.net/hoiven/article/details/51362582 如果你需要使用规律的时间间隔重复执行一些方法,最简单的方式是使用定时器(timer). ...
- 监控SQLServer 数据库表每天的空间变化情况
阅读完桦仔的<分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)>后,我想使用文中提供的代码做一个统计表每天的新增行数及新增存储空间的功能 实现步骤如下: 1 ...
- 模板与STL学习简单的笔记
一.如何进行泛型编程 C/C++是一种静态编程语言,必须需要把代码翻译成可执行的二进制可执行程序然后再运行,一旦编译好之后就不能再变了(数据类型也就必须确定下无法更改,因此要为每一种数据类型编写一份算 ...
- Windows Pre-commit hook for comment length Subversion
@echo off :: Stops commits that have empty log messages. @echo off setlocal rem Subversion sends thr ...
- wxpython 编程触发菜单或按钮事件
最近逐步熟悉wxpython,编写了几个小小功能的GUI程序,GUI中免不了会有在代码中触发控件事件的业务需求.在其他Gui界面的语言中有postevent.triggerevent 调用事件名称的函 ...
- 构造个人轻量级XSS平台获取管理员cookie并登录
一.前言 本平台是个人轻量级XSS测试平台,仅作为练习参考. 二.实验环境 服务器操作系统:Centos 7 Web容器:Apache 三.平台搭建过程 安装Apache 安装PHP 安装Git工具 ...
- 【2017-01-08】QTimer与QThread的调度时间精度
在最近的项目开发中,我发现有的人喜欢用QThread来实现需要循环执行的工作流,而有的人又喜欢用QTimer来实现. 在表面上,两种实现方式似乎都可以,但我觉得QTimer的精度可能会有问题,首先看一 ...
- [2018HN省队集训D8T3] 水果拼盘
[2018HN省队集训D8T3] 水果拼盘 题意 给定 \(n\) 个集合, 每个集合包含 \([1,m]\) 中的一些整数, 在这些集合中随机选取 \(k\) 个集合, 求这 \(k\) 个集合的并 ...