题目链接:洛谷

这道题是很久以前NTF跟我说的,现在想起来把它做了。。。

我们发现,如果蛇的两头都在矩形里或矩形外,则询问为偶数,否则为奇数。

所以我们询问每一行和每一列,就能知道蛇的两头的横纵坐标了。

但是有一种情况不行,那就是两头在同一行或列上(以下只考虑同一行的),但是它们一定不在同一列,所以可以找到它们所在的列,然后通过二分找出它们所在的行。

具体实现可以看代码。

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
inline int read(){
int ch = getchar(), res = ;
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){
res = res * + ch - '';
ch = getchar();
}
return res;
}
int n, cnt;
pair<int, int> res[];
inline int query(int a1, int b1, int a2, int b2){
printf("? %d %d %d %d\n", a1, b1, a2, b2);
fflush(stdout);
return read() & ;
}
inline int solve1(int x){
int l = , r = n, mid;
while(l < r){
mid = l + r >> ;
if(query(x, l, x, mid)) r = mid;
else l = mid + ;
}
return l;
}
inline int solve2(int x){
int l = , r = n, mid;
while(l < r){
mid = l + r >> ;
if(query(l, x, mid, x)) r = mid;
else l = mid + ;
}
return l;
}
int main(){
n = read();
for(Rint i = ;i <= n;i ++)
if(query(i, , i, n)) res[cnt ++] = make_pair(i, solve1(i));
if(!cnt){
for(Rint i = ;i <= n;i ++)
if(query(, i, n, i)){
if(!cnt) res[cnt ++] = make_pair(solve2(i), i);
else res[cnt ++] = make_pair(res[].first, i);
}
}
printf("! %d %d %d %d\n", res[].first, res[].second, res[].first, res[].second);
fflush(stdout);
}

CF1153E

CF1153E Serval and Snake【构造】的更多相关文章

  1. CF1153E Serval and Snake

    题目地址:CF1153E Serval and Snake 这是一道交互题 由于只需要确定起点和终点 你选择的矩形会将整个矩形分成的两个部分 如果起点和终点在同一个部分里,那么很显然回答应该是个偶数 ...

  2. CF1153E Serval and Snake(交互题)

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

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

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

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

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

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

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

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

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

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

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

  8. UVALive 7269 Snake Carpet (构造)

    题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...

  9. 构造 hihocoder 1257 Snake Carpet (15北京I)

    题目传送门 题意:贪吃蛇,要求长度奇数的蛇转弯次数为正奇数,长度偶数转弯次数为正偶数,且组成矩形.(北大出的题咋都和矩形相关!!!) 分析:构造找规律,想到就简单了.可以构造 宽:(n + 1) / ...

随机推荐

  1. 此项目与Visual Studio的当前版本不兼容的报错

    问题再现:程序是用visual studio 2013开发的,放在本地运行报此项目与Visual Studio的当前版本不兼容.本地是visual studio 2010. 解决办法: <1&g ...

  2. (十)web服务与javaweb结合(1)

    一.解决方法 A . 编写一个监听器,在监听器中发布服务 二.案例一 方法A:编写一个监听器,在监听器中发布服务 1. 编写服务接口 package com.shyroke.service; impo ...

  3. JDBC 复习5 mysql 的自增长主键 auto_increment

    MySQL 自增长主键 (1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号.编号从1开始,并1为基数递增. (2)把0插入AUTO_INCRE ...

  4. 【原创】大叔经验分享(84)spark sql中设置hive.exec.max.dynamic.partitions无效

    spark 2.4 spark sql中执行 set hive.exec.max.dynamic.partitions=10000; 后再执行sql依然会报错: org.apache.hadoop.h ...

  5. javascript的装载和执行

    前言 为什么要采用js来create一个script标签,设置src然后append到head中,而不是直接使用script标签,这样不是更简单点吗? javascript的装载和执行 首先,我想说一 ...

  6. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  7. h5常见

    Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面//一.HTML页面结构<meta name="viewport" content="widt ...

  8. zabbix初级进阶

    目录 一.理论概述 zabbix功用 运行条件 缺点 zabbix组件 部署 web安装zabbix 优化 总结 这篇文章主要对zabbix有一个全面且简单的了解 一.理论概述 zabbix功用 检测 ...

  9. TCP、Http和Socket 优劣比较

    转自:http://www.cnblogs.com/webwlsong/p/3198712.html 了解HTTP和Socket之前先对网络7层协议有个了解: 7 应用层6 表示层5 会话层 4 传输 ...

  10. nomn文件分析

    #encoding=gbk import os import re import math from os import path ''' 手动输入文件nmon文件路径,要截取的开始时间,结束时间 ' ...