CF1063C Dwarves, Hats and Extrasensory Abilities
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1063C Dwarves, Hats and Extrasensory Abilities相关的知识,希望对你有一定的参考价值。
CF1063C Dwarves, Hats and Extrasensory Abilities
题意:
首先题目会给出 n ,表示要输入多少点。 然后你输出n 个点的坐标,每输出一个点会告诉你这个点的颜色是黑色或者白色。 最后你需要输出两个点的坐标代表一条直线,这条直线能够将你刚刚给出的点分成两份,一份全都是黑色的点,另一份全都是白色的点。
所有的点不能重叠,所有点不能和最后输出的直线重叠,每个点的黑白是随机给出的,你需要保证你输出的数据有解并输出解。
题解:
基本上交互都跟二分有关系
我一开始一点头绪都没有,但我们可以这样想,我们可以在一条线上选黑白点,然后不断询问中点位置的颜色,不断二分距离范围。
就比如如果(0,0)是白色,下一次就问(1e9/2,0),如果是黑色,就问(1e9/2/2,0)是什么颜色,这样二分找,可以将黑白分隔开,最后答案就是最后两个黑白快的中点
log2(1e9)=29.897353,n最大30,有可能会被卡?我提交后还真是,在59这个点疯狂被卡,我猜应该是二分到最后刚好用完没地方了,导致最后答案与某个黑白块重叠,这咋整?
我突然想到一个方法,我们最后的答案想的是二分最后一下,得到一个整数解,但题目要求你输出的是直线,而这个直线与黑白所在直线的交点不用是整数点,所以我们可以输出最后一个白块下方的点,最后一个黑块上方的点,这样的直线也正好平分黑白点,而且不会占用整数点
代码:
#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{
x= 0;
char c= getchar();
bool flag= 0;
while (c < '0' || c > '9')
flag|= (c == '-'), c= getchar();
while (c >= '0' && c <= '9')
x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();
if (flag)
x= -x;
read(Ar...);
}
template <typename T> inline void write(T x)
{
if (x < 0) {
x= ~(x - 1);
putchar('-');
}
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
startTime = clock ();
freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
endTime= clock();
printf("\\nRun Time:%lfs\\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
map<int,int>mp;
int main()
{
rd_test();
int n;
cin>>n;
int l=0,r=1e9;
printf("0 1\\n");
mp[0]=1;
fflush(stdout);
int lf=-1,f=-1,rf=-1;
string s;
cin>>s;
if(s=="black")lf=0;
else lf=1;
for(int i=1;i<n;i++){
int mid=l+r+1>>1;
printf("%d 1\\n",mid);
fflush(stdout);
mp[mid]=1;
cin>>s;
if(s=="black")f=0;
else f=1;
if(f==lf)l=mid;
else if(f==rf)r=mid;
else if(rf==-1){
rf=f;
r=mid;
}
}
printf("%d %d %d %d\\n",l,0,r,2);
//Time_test();
}
以上是关于CF1063C Dwarves, Hats and Extrasensory Abilities的主要内容,如果未能解决你的问题,请参考以下文章
cf1064E. Dwarves, Hats and Extrasensory Abilities(二分 交互)
Codeforces #1063C Dwarves, Hats and Extrasensory Abilities