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 ...
随机推荐
- django框架小技巧
带命名空间的URL名字 多应用中路由定义,采用命名空间,防止冲突 url(r'^polls/', include('polls.urls', namespace="polls")) ...
- Socket 群聊功能
1.Server端: 拥有一个存放与客户端连接对象的List<socket> 有一个客户端发信息后 遍历List 实现群发功能 代码如下: package com.socket; impo ...
- Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。
https://github.com/jhao104/proxy_pool/blob/master/doc/introduce.md 3.代码模块 Python中高层次的数据结构,动态类型和动态绑定, ...
- php验证身份证号码有效性
<?php // 18位身份证校验码有效性检查 // idcard_checksum18('...'); function idcard_checksum18($idcard) { if (st ...
- iOS 流布局 UICollectionView使用(UICollectionVIew的代理方法)
UICollectionViewDataSource协议 这个协议主要用于collectionView相关数据的处理,包含方法如下: 设置分区数(这个是可选实现的) - (NSInteger)numb ...
- 最新App Store审核指南与10大被拒理由
最近,苹果在官网给出了截至2015年2月份应用被拒绝的十大理由,其中50%以上的应用被拒绝都是因为这10个原因,其中7个理由和2014年相同,其中排名前三的原因分别是:需要补充更多信息.存在明显的bu ...
- 《C prime plus (第五版)》 ---第11章 字符串和字符串函数---3
字符串函数总结: 下面是头文件 string.h 中定义的函数: 序号 函数 & 描述 1 void *memchr(const void *str, int c, size_t n)在参数 ...
- hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
题目1 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一条路 ...
- 在ubuntu环境安装youcompleteme
sudo apt-get update #更新软件源 sudo apt-get clang #安装clang sudo apt-get cmake #安装cmake sudo apt-get inst ...
- 分享知识-快乐自己:Oracle基本语法(创建:表空间、用户、授权、约束等)使用指南
Oracle12c 与 Oracle11g 创建用户时有差别.Oracle12C默认为 CDB模式 这时创建用户的时候需要加上 c## 开头:例如:c##MLQ. --说明--需求:创建表空间(MLQ ...