Dwarves, Hats and Extrasensory Abilities Codeforces - 1063C
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不能只输出\n,必须手动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\n",1000000000,1000000000); 20 fflush(stdout); 21 scanf("%s",tmp); 22 c=tmp[0]; 23 if(n==1) 24 { 25 printf("%d %d %d %d\n",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\n",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\n",t,mid-t,t+1,mid-t-1); 42 return 0; 43 }