2019.2.14 考试T3 交互题
\(\color{#0066ff}{ 题目描述 }\)
由于机房被成功拯救了,花_Q很高兴,花_Q生成了一个 0 到 N - 1 的排列(排列的下标从 0 到 N - 1 )。保证排列中 0 在 N - 1 的左边。
lzxkj一向很好奇,他想要知道这个排列是什么,但是由于lzxkj和阿习小pen友一起来的,的花_Q就是不告诉他。
阿习小pen友很聪明,Ta每次向花_Q询问一个区间 [l, r] ,花_Q 会告诉Ta区间 [l, r] 内的最大值减去最小值的值(极差)。阿习小朋友在不超过 10000 次询问后就从花_Q那里得到他的区间了。 lzxkj 很满意 假如你是阿习,你能还原出这个排列吗?
你需要在不超过10000次询问之内还原这个排列。
你不需要也不应该实现主函数,你需要实现如下函数:
get_permutation(N, ans)
其中 N 代表排列的长度,你需要将计算出来的答案保存在 ans 数组中, ans[i] 代表第 i 个位置的排列的值。
你可以调用 query(l, r) 来询问区间 [l, r] 的内的极差。你需要保证 0 <= l <= r <= N - 1 。
调用一次 query 函数的复杂度为 O(r - l + 1) 。
你需要提交一个源文件 permutation.cpp 并实现上述函数,并且遵循下面的命名和接口。
你的源代码中需要包含头文件 permutation.h 。
你需要实现的函数 get_permutation 定义如下:
void get_permutation(int N, int ans[]);
函数 query 的接口如下:
int query(int l, int r);
你需要在目录下使用如下命令编译得到可执行程序:
g++ grader.cpp permutation.cpp -o permutation -O2 -lm
可执行文件从标准输入读入以下格式的数据:
第一行包含一个整数N。需要保证N在 [1, 5000] 之间。
第二行包含 N 个 0 ~ N - 1 之间的正整数,表示 0 ~ N - 1 的排列。
你的输入要保证是一个排列。
读入完成后,交互库将会调用 get_permutation 函数。如果此时你调用 query 函数的次数超过 10000 次,则交互库会输出错误信息并退出。
当你的函数返回后,交互库会判断 ans 数组里的答案是否正确。如果正确则会输出 "Correct" ,否则会输出错误信息。
最终评测时只收取 permutation.cpp 。题目首先会受到和非交互式程序题相同的限制。例如编译错误会导致整道题目得 0 分,运行时错误、超过时间限制、超过空间限制等会导致相应测试点得 0 分等。你只能访问自己定义的和交互库给出的变量及其对应的内存空间,尝试访问其他空间将可能导致编译错误或运行错误。
在上述条件基础上,在一个测试点中,你得到满分,当且仅当你的每次调用都合法,并且最终返回的结果正确。
题目中所给的时间、空间限制为你的代码和交互库加起来可以使用的时间和空间。我们保证,对于任何合法的数据及在限制范围内的调用,交互库运行所用的时间不会超过 1s ,运行所占内存不会超过 128M ,也就是说,选手实际可用的时间至少为 1s ,实际可用内存至少为 384M 。
\(\color{#0066ff}{输入格式}\)
函数传参
\(\color{#0066ff}{输出格式}\)
将输出存入ans数组内
\(\color{#0066ff}{输入样例}\)
5
0 3 2 4 1
\(\color{#0066ff}{输出样例}\)
Correct
\(\color{#0066ff}{数据范围与提示}\)
一共有 20 个测试点,每个测试点 5 分。
对于 30% 的数据,有 N <= 100 。
对于 60% 的数据,有 N <= 1000 。
对于 100% 的数据,有 N <= 5000 。
\(\color{#0066ff}{ 题解 }\)
首先,钦定0为第一个
然后询问(0,1),钦定第二个为刚刚询问的ans
从第三个数开始,每次询问(i-2,i)和(i-1,i),记为a,b
到底是上一个数+b还是-b,讨论a是由这三个数中的哪两个数取得的,就可以唯一确定
最后的序列值域可能不是[0,n-1],同时减去最小值变回来
还有,0必须在n-1的左边,如果在右边,就让所有数变为(n-1-当前数),这样,差不变,0和n-1反向
就没了
#include"permutation.h"
#include<cstdio>
#include<iostream>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 5010;
bool flag;
int n;
int abs(int x) { return x > 0? x : -x; }
void get_permutation(int N, int ans[]) {
ans[0] = 0;
ans[1] = query(0, 1);
for(int i = 2; i < N; i++) {
int t1 = query(i - 2, i);
int t2 = query(i - 1, i);
int a = ans[i - 1] + t2;
int b = ans[i - 1] - t2;
if(t1 == abs(ans[i - 1] - ans[i - 2])) {
if(a >= std::min(ans[i - 1], ans[i - 2]) && a <= std::max(ans[i - 1], ans[i - 2])) ans[i] = a;
else ans[i] = b;
}
else if(t1 == t2) {
if(ans[i - 1] > ans[i - 2]) ans[i] = b;
else ans[i] - a;
}
else {
if(ans[i - 1] > ans[i - 2]) ans[i] = a;
else ans[i] = b;
}
}
int min = 0x7fffffff;
for(int i = 0; i < N; i++) min = std::min(min, ans[i]);
for(int i = 0; i < N; i++) ans[i] -= min;
int pos0, posn;
for(int i = 0; i < N; i++) {
if(ans[i] == 0) pos0 = i;
if(ans[i] == N - 1) posn = i;
}
if(pos0 > posn) for(int i = 0; i < N; i++) ans[i] = N - 1 - ans[i];
}
2019.2.14 考试T3 交互题的更多相关文章
- 2019.3.14解题报告&补题报告
A题 题意: 输入r, c,代表r*c的矩阵,接下来一行,是r个数,代表每一行里最大的数:接下来一行,是c个数,代表每一列中的最大数.求所给数据是否冲突. 思路:判断r个数中最大数maxr和c个数中最 ...
- 2019.2.25考试T3, 离线+线段树
\(\color{#0066ff}{题解}\) #include<bits/stdc++.h> #define LL long long LL in() { char ch; LL x = ...
- 2019.2.14 考试T1 FFT
\(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...
- 2019.3.18考试&2019.3.19考试&2019.3.21考试
2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...
- 每日一练ACM 2019.04.14
2019.4.14 第1001题:Sum Problem Problem DescriptionHey, welcome to HDOJ(Hangzhou Dianzi University Onli ...
- Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...
- E. XOR Guessing 交互题 Educational Codeforces Round 71 (Rated for Div. 2)
E. XOR Guessing 交互题. 因为这个数最多只有14位 0~13,所以我们可以先处理后面7位,然后再处理后面7位. 因为异或的性质,如果一个数和0异或,那么就等于本身. 所以我们第一次异或 ...
- Codeforces Round #812 (Div. 2) D. Tournament Countdown(交互题)
记录一下第一次写交互题 题目大意:一共有1<<n个人参加一场竞标赛,需要你通过比较两人的胜场来判断谁晋级,最终获得第一名 最多1/3*2^(n+1)次询问,每次询问query(a,b),如 ...
- 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]
交互题就是程序与电脑代码的交互. 比如没有主函数的程序,而spj则给你一段主函,就变成了一个整体函数. 还有一种就是程序和spj之间有互动,这个用到fflush(stdout);这个函数就可以实现交互 ...
随机推荐
- AngularJS:API
ylbtech-AngularJS:API 1.返回顶部 1. AngularJS API API 意为 Application Programming Interface(应用程序编程接口). An ...
- 【转】rails中的时区问题
http://eric-gao.iteye.com/blog/1058197 解释4个时区设置的不同: config.active_record.default_timezoneconfig.time ...
- nginx for windows之负载均衡
1.编辑c:\nginx\conf\nginx.conf 添加以下内容: #user nobody; #启动进程worker_processes 1; #全局错误日志及PID文件err ...
- #调整随机森林的参数(调整max_features,结果未见明显差异)
#调整随机森林的参数(调整max_features,结果未见明显差异) from sklearn import datasets X, y = datasets.make_classification ...
- Python 面向对象 (进阶篇)
<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可 ...
- Ajax入门(二)Ajax函数封装
如果看了的我上一篇博客<Ajax入门(一)从0开始到一次成功的GET请求>的话,肯定知道我们已经完成了一个简单的get请求函数了.如下: 1234567891011121314151617 ...
- android viewpage解决嵌套
子viewpage 自定义 写法一: public class ChildViewPager extends ViewPager{ /** 触摸时按下的点 **/ PointF downP = new ...
- HTTP、TCP、UDP、Socket关系详解
TCP.UDP和HTTP关系是什么? 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议.在传输层中有TCP ...
- 恢复oracle的回收站的所有的表
使用sys as sysdba 进入到sqlplus的控制界面 sqlplus / as sysdba 执行相关的命令,自动生成一个脚本文件 spool d:/a.sql select 'flashb ...
- 洛谷P2146 树链剖分
题意 思路:直接树链剖分,用线段树维护即可,算是树剖的经典题目吧. 代码: #include <bits/stdc++.h> #define ls(x) (x << 1) #d ...