CodeChef - ELHIDARR Find an element in hidden array(二分交互)
Find an element in hidden array
There is an array of length N consisting of non-negative integers. The array is sorted in non-decreasing order. Each number in the array appears exactly K times, except one element, which appears at least once, but less than K times. Your task is to identify that element.
This is an interactive problem. You are only given the integer N in the input. Both the array and the value of K are hidden. You are allowed to ask the judge the following queries: What is the value of the element at index i of the array? Identify the value of the element with frequency less than K by asking at most 60 such queries.
Input and Output
The first line of the input contains a single integer T denoting the number of test cases.
For each test case, you should start by reading a single line containing one integer N from the input.
You can interact with the judge using the standard input and output. There are two types of operations: to perform one operation, you should print to the standard output a line containing two space-separated integers type and val.
- If type = 1, you are asking the judge a query for the value of the element of the array at index val. After printing this line, the judge will print to the standard input a line containing one integer corresponding to the value of the element at index val.
- If type = 2, you are telling the judge that the element with frequency less than K is val. For each test case, you should perform this operation exactly once at the end. This is not counted towards the 60 queries.
Note
Don't forget to flush the standard output after printing each line. It can be done using fflush(stdout) in C/C++, System.out.flush() in Java and sys.out.flush() in Python.
If you ask more than 60 queries, your program will get the verdict Wrong Answer.
Constraints
- 1 ≤ T ≤ 104
- 3 ≤ N ≤ 105
- 2 ≤ K ≤ N - 1
- each element of the array lies between 1 and 109 inclusive
Example
Input / judge feedback your output
1
3
1 2
1
1 3
5
1 1
1
2 5
Explanation
Example case 1: Suppose the array is [1, 1, 5]. Note that the value of K is 2, but it is hidden from you.
In the first query, you request the value of the 2nd element and the judge answers 1. Then you request the value of the 3rd element and the judge answers 5, then the value of the first element and the judge answers 1.
Now, you tell the judge that the answer is 5. You made a total of 3 queries.
题意:有一个由非负整数组成的长度n的数组。数组按非递减顺序排序。数组中的每个数字恰好出现k次,除了一个元素,至少出现一次,但小于k次。你的任务是识别那个元素。
第一次做交互的题。刚拿到题目有点懵比。。因为它并不是我们习惯的输入输出格式,需要先输出再输入。
输出的是向计算机询问的数值下标,输入的是计算机回答的数值元素(注意加入fflush(stdout);)。很锻炼逆向思维。
因为题目限制了在60次内找出value,因此容易想到二分,并用map加以记录。先找到中间值再找出头部位置,看是否位于m%k==1的位置,开始用了二分嵌套WA(超出次数)。
后来想到只用一层二分,找出理论上的头尾部位置(所在位置相距k-1),并比较其值是否相同即可判断打破规律的元素群在左边还是在右边。
#include<bits/stdc++.h>
#define MAX 100005
#define INF 0x3f3f3f3f
using namespace std; map<int,int> mp; int main()
{
int t,n,i,j;
scanf("%d",&t);
while(t--){
mp.clear();
scanf("%d",&n);
printf("1 1\n");
fflush(stdout);
scanf("%d",&mp[]);
printf("1 %d\n",n);
fflush(stdout);
scanf("%d",&mp[n]);
int l=,r=n,m;
int k=;
while(l<=r){
m=(l+r)/;
if(!mp[m]){
printf("1 %d\n",m);
fflush(stdout);
scanf("%d",&mp[m]);
}
if(mp[]<mp[m]) r=m-;
else{
k=max(k,m);
l=m+;
}
}
if(!mp[n-k+]){
printf("1 %d\n",n-k+);
fflush(stdout);
scanf("%d",&mp[n-k+]);
}
if(mp[n-k+]!=mp[n]){
printf("2 %d\n",mp[n]);
fflush(stdout);
continue;
}
if(!mp[n-k]){
printf("1 %d\n",n-k);
fflush(stdout);
scanf("%d",&mp[n-k]);
}
if(mp[n-k]==mp[n]){
printf("2 %d\n",mp[]);
fflush(stdout);
continue;
}
int ans=INF;
l=+k,r=n-k;
while(l<=r){
m=(l+r)/;
if(!mp[m-(m-)%k]){
printf("1 %d\n",m-(m-)%k);
fflush(stdout);
scanf("%d",&mp[m-(m-)%k]);
}
if(!mp[m-(m-)%k+k-]){
printf("1 %d\n",m-(m-)%k+k-);
fflush(stdout);
scanf("%d",&mp[m-(m-)%k+k-]);
}
if(mp[m-(m-)%k]==mp[m-(m-)%k+k-]){
l=m+;
}
else{
ans=min(ans,mp[m-(m-)%k]);
r=m-;
}
}
printf("2 %d\n",ans);
fflush(stdout);
}
return ;
}
CodeChef - ELHIDARR Find an element in hidden array(二分交互)的更多相关文章
- CodeChef - ELHIDARR Find an element in hidden array(互动题)题解
题意:有一串不递减的串,串中的任意元素都有k个,除了一个元素,他只有1 <= n < k-1个,你现在能向oj做出以下操作: 输出:1 pos,oj会返回pos位置的元素值 输出:2 va ...
- 34. Find First and Last Position of Element in Sorted Array + 二分
题意懒得抄了,大概是:在升序数组中给定整数target,找到第一个和最后一个target的索引,找到返回{index1, index2},否则返回{-1, -1}: 时间复杂度要求:O(logn) 分 ...
- check the element in the array occurs more than half of the array length
Learn this from stackflow. public class test { public static void main(String[] args) throws IOExcep ...
- Kth Largest Element in an Array
Find K-th largest element in an array. Notice You can swap elements in the array Example In array [9 ...
- leetcode@ [315/215] Count of Smaller Numbers After Self / Kth Largest Element in an Array (BST)
https://leetcode.com/problems/count-of-smaller-numbers-after-self/ You are given an integer array nu ...
- leetcode面试准备:Kth Largest Element in an Array
leetcode面试准备:Kth Largest Element in an Array 1 题目 Find the kth largest element in an unsorted array. ...
- Majority Element in an Array
Problem Statement Given a large array of non-negative integer numbers, write a function which determ ...
- Leetcode 34 Find First and Last Position of Element in Sorted Array 解题思路 (python)
本人编程小白,如果有写的不对.或者能更完善的地方请个位批评指正! 这个是leetcode的第34题,这道题的tag是数组,需要用到二分搜索法来解答 34. Find First and Last Po ...
- leetcode-algorithms-34 Find First and Last Position of Element in Sorted Array
leetcode-algorithms-34 Find First and Last Position of Element in Sorted Array Given an array of int ...
随机推荐
- protobuf + maven 爬坑记
疯狂创客圈 死磕Netty 亿级流量架构系列之20 [博客园 总入口 ] 本文说明 本篇是 netty+Protobuf 整合实战的 第一篇,完成一个 基于Netty + Protobuf 实战案例. ...
- adjA=(detA)A-1
A–>adjA 连续性 反函数
- 【题解】 P1373 小a和uim之大逃离
题解 P1373 小a和uim之大逃离 传送门 一道dp好题 乍看此题,感觉要这样设计: \(dp(x)(y)(mod_{a})(mod_{uim})(0/1)\) , 但是我上午考试就MLE了,赶紧 ...
- 流畅python学习笔记第十八章:使用asyncio包处理并发(一)
首先是线程与协程的对比.在文中作者通过一个实例分别采用线程实现和asynchio包实现来比较两者的差别.在多线程的样例中,会用到join的方法,下面来介绍下join方法的使用. 知识点一:当一个进程启 ...
- TensorFlow Action(开山使用篇)
1.TensorFlow安装: 使用pip install tensorflow安装CPU版: 或使用pip install tensorflow-gpu==1.2.1指定版本安装GPU版. 2.Te ...
- 2014暑假ACM训练总结
2014暑假ACM训练总结报告 匆匆之中,一个暑假又过去了,在学校训练的这段日子真的是感觉日子过得好快啊! 时光如箭,日月如梭! 匆忙的学习之中一个暑假就这样结束了,现在就来写一些总结吧,供自己以后阅 ...
- Java接口 详解(二)
上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用—工厂设计模式(Factory) 我们先看一个范例: package com. ...
- input标签添加上disable属性在移动端字体颜色不兼容的解决办法。
input[disabled],input:disabled,input.disabled{ color: #999; -webkit-text-fill-color:#999; -webkit-op ...
- 分享知识-快乐自己:Hibernate 中 get() 和 load()、sava、update、savaOrUpdate、merge,不同之处及执行原理?
1):Hibernate 中 get() 和 load() 有什么不同之处? 1)Hibernate的 get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在缓存中查 ...
- NOIP 2014【斗地主】
这真是道大火题. 因为保证数据随机,所以开始很多人直接用搜索 + 贪心水过去了,后来,为了遏制骗分这种不良风气的传播,各大 OJ 相继推出了斗地主加强版-- 正解: 先爆搜顺子,枚举打或不打,打多少张 ...