题目地址:CF1153E Serval and Snake

这是一道交互题

由于只需要确定起点和终点

你选择的矩形会将整个矩形分成的两个部分

如果起点和终点在同一个部分里,那么很显然回答应该是个偶数

反之则为奇数

因此我们可以先通过

    int i;
    for (i = 1; i < n; i++) {
        printf("? 1 1 %d %d\n", n, i);
        fflush(stdout);
        scanf("%d", &x);
        if (x & 1) break;
    }

来确定起点和终点是否在同一列

如果不在同一列(即 \(i!=n\) ),那么 \(i\) 即为起点和终点这两个点中靠左的那个点所在的列

那么同理可以找到起点和终点这两个点中靠右的那个点所在的列

如果在同一列(即 \(i==n\) ) ,那么他们肯定不会在同一行(因为起点和终点是不同的点)

那么可以用同样的方法将两个点确定在两行内

现在已经能够锁定两个点在哪两条(行或列)了

在一条中确定一个点,二分再用奇偶判断即可

这样最坏的询问次数为 \(999+1000+10+10=2019\)

正好!

#include <bits/stdc++.h>
using namespace std;
int n, x, i, j;
int ax1, ay1, ax2, ay2;

int main() {
    cin >> n;
    for (i = 1; i < n; i++) {
        printf("? 1 1 %d %d\n", n, i);
        fflush(stdout);
        scanf("%d", &x);
        if (x & 1) break;
    }
    if (i != n) {
        for (j = n; j > 1; j--) {
            printf("? 1 %d %d %d\n", j, n, n);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) break;
        }
        int l = 1, r = n;
        while (l < r) {
            int mid = (l + r + 1) >> 1;
            printf("? %d %d %d %d\n", mid, i, n, i);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) l = mid;
            else r = mid - 1;
        }
        ax1 = l, ay1 = i;
        l = 1, r = n;
        while (l < r) {
            int mid = (l + r + 1) >> 1;
            printf("? %d %d %d %d\n", mid, j, n, j);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) l = mid;
            else r = mid - 1;
        }
        ax2 = l, ay2 = j;
    } else {
        for (i = 1; i < n; i++) {
            printf("? 1 1 %d %d\n", i, n);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) break;
        }
        for (j = n; j > 1; j--) {
            printf("? %d 1 %d %d\n", j, n, n);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) break;
        }
        int l = 1, r = n;
        while (l < r) {
            int mid = (l + r + 1) >> 1;
            printf("? %d %d %d %d\n", i, mid, i, n);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) l = mid;
            else r = mid - 1;
        }
        ax1 = i, ay1 = l;
        l = 1, r = n;
        while (l < r) {
            int mid = (l + r + 1) >> 1;
            printf("? %d %d %d %d\n", j, mid, j, n);
            fflush(stdout);
            scanf("%d", &x);
            if (x & 1) l = mid;
            else r = mid - 1;
        }
        ax2 = j, ay2 = l;
    }
    printf("! %d %d %d %d\n", ax1, ay1, ax2, ay2);
    return 0;
}

CF1153E Serval and Snake的更多相关文章

  1. CF1153E Serval and Snake(交互题)

    题目 CF1153E Serval and Snake 很有意思的一道交互题 做法 我们观察到,每次查询一行,当这一行仅包含一端是返回的答案是奇数 根据这个性质查询每一行每一列,我们大体能知道两端的位 ...

  2. CF1153E Serval and Snake【构造】

    题目链接:洛谷 这道题是很久以前NTF跟我说的,现在想起来把它做了... 我们发现,如果蛇的两头都在矩形里或矩形外,则询问为偶数,否则为奇数. 所以我们询问每一行和每一列,就能知道蛇的两头的横纵坐标了 ...

  3. Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)

    人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...

  4. Codeforces Round #551 (Div. 2) EF Solution

    E. Serval and Snake 对于一个矩形,如果蛇的一条边与它相交,就意味着这条蛇从矩形内穿到矩形外,或者从矩形外穿到矩形内.所以如果某个矩形的答案为偶数,意味着蛇的头尾在矩形的同一侧(内或 ...

  5. 【Codeforces】Codeforces Round #551 (Div. 2)

    Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...

  6. Codeforces Round #551 (Div. 2) A-E

    A. Serval and Bus 算出每辆车会在什么时候上车, 取min即可 #include<cstdio> #include<algorithm> #include< ...

  7. Codeforces Round #551 (Div. 2) A~E题解

    突然发现上一场没有写,那就补补吧 本来这场应该5题的,结果一念之差E fail了 A. Serval and Bus 基本数学不解释,假如你没有+1 -1真的不好意思见人了 #include<c ...

  8. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  9. Leetcode: Design Snake Game

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

随机推荐

  1. K8S集群技术

    1.快速部署K8S环境 k8s-m :10.0.0.11   k8s-n1 :10.0.0.12   k8s-n2 :10.0.0.13 2.所有节点安装docker环境及依赖 2.1 上传docke ...

  2. 英特尔关闭PC计算卡项目—插个卡片就能升级个人电脑

    在 2017 年的美国国际消费电子展上,电脑芯片巨头英特尔公司曾经推出一个名为“计算卡”的新产品,相当于把个人电脑的重要零部件整合到了一张信用卡大小的卡片设备中,未来用户升级个人电脑,只需要拔下旧卡片 ...

  3. Linux内存管理 (10)缺页中断处理

    专题:Linux内存管理专题 关键词:数据异常.缺页中断.匿名页面.文件映射页面.写时复制页面.swap页面. malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有 ...

  4. Python--day01(计算机基础)

    Python: python 是一门面向后台的编程语言,在大数据,数据分析,机器学习,人工智能,爬虫,自动化运维,web等方面具有强大功能. 基础阶段学习内容:基本语法,文件处理,函数,模块,面向对象 ...

  5. threejs 初识

    用于展示3D动效,就是 跟拍电影一样,需要有3大模块:scene,camera,renderer. scene:场景,用于放置用到的模型. camera:摄像机,拍电影似的,得有个摄像机. rende ...

  6. 细述:nginx http内核模块提供的变量和解释

    导读 ngx_http_core_module模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它nginx模块. 在我们对请求做策略如改写等等都会使用到一些变量,顺便 ...

  7. mysql多表多字段查询并去重

    mysql多表多字段查询并去重 - MySQL-ChinaUnix.nethttp://bbs.chinaunix.net/forum.php?mod=viewthread&tid=42549 ...

  8. [转帖]Go中的下划线

    Go中的下划线 https://blog.csdn.net/wanglei9876/article/details/50475864 下划线的作用: 在import 时 是仅引入 init 函数 在正 ...

  9. 栈(LIFO)

    1 栈的定义 栈是限定在表尾进行插入和删除操作的线性表. 2 栈的特点 1)栈是特殊的线性表,线性表也具有前驱后继性: 2)栈的插入和删除操作只能在表尾即栈顶进行: 3)后进先出. 3 栈的实现及关键 ...

  10. Python学习之路——装饰器

    开放封闭原则:不改变调用方式与源代码上增加功能 ''' 1.不能修改被装饰对象(函数)的源代码(封闭) 2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放) ''' 装饰器 # 把 ...