1 条题解

  • 0
    @ 2026-5-2 0:43:21

    \gdef \lb{\operatorname{lb}}

    首先 (x,y)(x, y) 只在水平或竖直方向移动是不会改变另一方向上的距离之和的,所以我们可以分别在水平方向和竖直方向上三分。

    但是本题的点是离散的,所以可以直接二分。

    但是直接二分的次数还是太多了,因为两次二分中加起来询问了同一个东西两次,所以我们把两个二分合到一起就行了。

    询问次数 3×\lb10769.76<753 \times \lb 10 ^ 7 \approx 69.76 < 75,可以通过。

    专栏文章审核结果

    很遗憾,您的《题解:P6716 [CCO 2018] Gradient Descent》不符合推荐标准。原因是:lb 是什么|审核管理员:【审核不让放】,对审核结果有疑问请私信交流。

    这里的 \lb\lblog2\log _ 2

    #include<iostream>
    
    int r, c, k;
    inline int ask(int x, int y) {
    	std::cout << "? " << x << " " << y << std::endl;
    	int R; std::cin >> R; return R;
    }
    
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(0), std::cout.tie(0);
    	
    	std::cin >> r >> c >> k;
    	
    	int l1 = 1, r1 = r, l2 = 1, r2 = c;
    	while(l1 < r1 || l2 < r2) {
    		int mid1 = l1 < r1 ? l1 + r1 >> 1 : 1;
    		int mid2 = l2 < r2 ? l2 + r2 >> 1 : 1;
    		int ret = ask(mid1, mid2);
    		if(l1 < r1)
    			if(ret < ask(mid1 + 1, mid2)) r1 = mid1;
    			else l1 = mid1 + 1;
    		if(l2 < r2)
    			if(ret < ask(mid1, mid2 + 1)) r2 = mid2;
    			else l2 = mid2 + 1;
    	}
    	int ans = ask(l1, l2); std::cout << "! " << ans << std::endl;
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    10644
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者