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

「每日一题-10.20」cf 1063C

hoj 13788 Dwarves

(CF#257)B. Jzzhu and Sequences

CF | Alyona and Numbers