Dwarves, Hats and Extrasensory Abilities Codeforces

https://codeforces.com/contest/1063/problem/C

首先可以想到一个简单做法:先钦定这个直线的斜率k=-1,然后设直线y=-x+b

设黑点放直线上方;如果已知(x,y)是黑点,那么y>-x+b,b<x+y

如果已知(x,y)是白点,那么b>x+y

可以二分b,对于每个b输出任意合法(x,y)满足x+y=b,然后根据结果更新b的范围

这样子初始时b可以为[1,2e9-1],可以发现log2(2e9)超过30了

然而试一下可以发现这样子会A不掉。。。发现有时会刚好少1次机会

然后我就不会了...期间还尝试了一些乱搞,然而发现那么写除了让自己pretestpassed并且FST以外什么用也没有(提交后WA59)

看了题解,发现很简单:只要开始时询问一个角上的点,比如询问右上角,如果是黑色,那么仍然按上面方法,如果是白色,那么设直线上方应该放的点为白点,然后仍然按上面方法

哎,我还是太菜了

错误记录:

1.写成fflush(input)

2.CF不能只输出 ,必须手动fflush(output)

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 char tmp[233],c;
14 int n;
15 int main()
16 {
17     int l,r,mid,t,i;
18     scanf("%d",&n);
19     printf("%d %d
",1000000000,1000000000);
20     fflush(stdout);
21     scanf("%s",tmp);
22     c=tmp[0];
23     if(n==1)
24     {
25         printf("%d %d %d %d
",0,1,1,0);
26         return 0;
27     }
28     l=1;r=2000000000-1;
29     for(i=2;i<=n;++i)
30     {
31         mid=l+((r-l)>>1);
32         t=mid/2;
33         printf("%d %d
",t,mid-t);
34         fflush(stdout);
35         scanf("%s",tmp);
36         if(tmp[0]==c)    r=mid-1;
37         else    l=mid+1;
38     }
39     mid=l+((r-l)>>1);
40     t=mid/2;
41     printf("%d %d %d %d
",t,mid-t,t+1,mid-t-1);
42     return 0;
43 }
View Code
原文地址:https://www.cnblogs.com/hehe54321/p/9851874.html