CF 714D Searching Rectangles 交互题 二分

题意:交互题,已知一个n*n的地图,电脑藏了两个不相交的矩形(矩形的边和坐标轴平行).
每次向电脑询问左下[x1,y1]右上[x2,y2]的矩形内完全包含多少个藏着的矩形.
n<=2^16.请在200次内猜出两个矩形左下,右上坐标.

先二分出两个不相交矩形的分界线,要么横着要么竖着.
接在在每一快中二分出矩形的四条边即可(最左,右,上,下边界)

#include <bits/stdc++.h>
using namespace std;

int n,ans[20],cnt=0;
inline int out(int x,int y,int fx,int fy)
{
    if(x>fx||y>fy)return 0;
    printf("? %d %d %d %d\n",x,y,fx,fy);
    fflush(stdout);
    int num;
    cin>>num;
    return num;
}
inline void solve(int x,int y,int fx,int fy)
{
    int l=x,r=fx,Ans=x;
       while(l<=r)
    {
        int mid=(l+r)>>1;
        int f=out(mid,y,fx,fy);
        if(f)
            l=mid+1,Ans=mid;
        else
            r=mid-1;
    }
    ans[++cnt]=Ans;
    l=y,r=fy,Ans=y;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        int f=out(x,mid,fx,fy);
        if(f==0)r=mid-1;
        else l=mid+1,Ans=mid;
    }
    ans[++cnt]=Ans;
    l=x,r=fx,Ans=fx;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        int f=out(x,y,mid,fy);
        if(f==0)l=mid+1;
        else r=mid-1,Ans=mid;
    }
    ans[++cnt]=Ans;
    l=y,r=fy,Ans=fy;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        int f=out(x,y,fx,mid);
        if(f==0)l=mid+1;
        else r=mid-1,Ans=mid;
    }
    ans[++cnt]=Ans;
}
int main()
{
    cin>>n;
    int l=1,r=n,flag=0;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        int f=out(1,1,n,mid),g=out(1,mid+1,n,n);
        if(f&&g)flag=1;
        if(f==0)l=mid+1;
        else r=mid-1;
    }
    if(flag)
    {
        solve(1,1,n,l);
        solve(1,l+1,n,n);
    }
    else
    {
        l=1,r=n;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            int f=out(1,1,mid,n);
            if(f==0)l=mid+1;
            else r=mid-1;
        }
        solve(1,1,l,n);
        solve(l+1,1,n,n);
    }
    printf("! ");
    for(int i=1;i<=8;i++)printf("%d ",ans[i]);
        printf("\n");
    return 0;
}
时间: 2024-08-08 14:35:33

CF 714D Searching Rectangles 交互题 二分的相关文章

CF 628A --- Tennis Tournament --- 水题

CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m <=n)个人进行比赛,剩余的n-m个人直接晋级, 直至只剩一人为止,问总共需要的水的数量和毛巾的数量 解题思路:毛巾数很简单: n*p即可 水的数量:1,2,4,8,16,32,64,128,256,512,提前打成一个表, 根据当前剩余的人数n在表中二分查找最大的小于等于n的数,结果即为本次进行比赛

Moscow Subregional 2010 Problem K. KMC Attacks 交互题、队列优化、枚举

ACM ICPC 2010-2011 NEERC Moscow Subregional Contest Moscow, October 24, 2010 Problem K. KMC Attacks Time limit: 2 seconds Memory limit: 256 megabytes Warrant VI is a remote planet located in the Koprulu Sector. Warrant VI features a strange huge fiel

CF 628B New Skateboard --- 水题

CD 628B 题目大意:给定一个数字(<=3*10^5),判断其能被4整除的连续子串有多少个 解题思路:注意一个整除4的性质: 若bc能被4整除,则a1a2a3a4...anbc也一定能被4整除: 利用这个性质,先特判第一位数字是否能被4整除,可以则++cnt, 之后从第二位数字开始,设当前位为i,先判断a[i]能否被4整除,可以则++cnt, 再判断a[i-1]*10+a[i]能否被4整除,可以则cnt = cnt + (i) 相关证明: 设一整数各个位置为a1,a2,a3,...,an,b

CF:Problem 426B - Sereja and Mirroring 二分或者分治

这题解法怎么说呢,因为我是把行数逐步除以2暴力得到的答案,所以有点二分的意思,但是昨天琦神说是有点像分治的意思,反正总的来说:就是从大逐步细化找到最优答案. 但是昨晚傻B了,靠!多写了点东西,然后就错了,刚才一练习,拿昨晚的代码一看,就把6行代码删去就过了,靠!昨晚应该是脑子进水了!!!!! 昨晚的代码: #include <iostream> #include <cstdio> #include <fstream> #include <algorithm>

Gym - 101375H MaratonIME gets candies 交互题

交互题介绍:https://loj.ac/problem/6 题意:输出Q X ,读入><= 来猜数,小于50步猜出就算过样例 题解:根本不需要每次输出要打cout.flush()... ac: #include<iostream> #include<string> using namespace std; int main() { int l = 1, r = 1e9; while (l <= r) { int mid = (l + r) / 2; cout &

Codeforces Round #504 E - Down or Right 交互题

1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1),能向右走就向右走,不能就向下走,直到走到斜对角线上.从(n,n)出发,能向上走就向上走,不能就向左走,直到走到斜对角线上. 因为保证有路,所以最后输出(1,1)出发的正向路径,加上从(n,n)出发的反向路径. #include <algorithm> #include <iterator&g

codeforces679A_Bear and Prime 100 交互题

传送门 第一道交互题 题意: 电脑事先想好了一个数[2,100] 你会每次问电脑一个数是否是它想的那个数的因数 电脑会告诉你yes或no 至多询问20次 最后要输出它想的数是质数还是合数 思路: 枚举<50的质数和4,9,25,49即可判断 4,9, 25,49单独看作质数是这样方便判断2^2,3^2,...,9^2 解释: 在使用多个输出函数连续进行多次输出时,有可能发现输出错误. 因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区, 结

2019雅礼集训 D10T2 硬币翻转 [交互题]

题目描述: coin.h: #include<string> void guess(); int ask(std::string coin); grader.cpp: #include "coin.h" #include <iostream> #include <assert.h> using namespace std; namespace U { using u64 = unsigned long long; using i64 = long l

Codeforces 1137D - Cooperative Game - [交互题+思维题]

题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不知道 $t,c$ 的值的情况下,他们同时从home出发,要最终到达flag处. 你只能选择移动哪几个人的棋子,但棋子移动到哪里由程序确定并给出. 题解: 看网上大佬一个神仙解法……看得我一愣一愣的…… 选定两颗棋子,第一颗每次都移动,第二颗隔一次移动一次.所以,进行了 $2t$ 次之后第二颗棋子刚好