zoukankan      html  css  js  c++  java
  • CF371 D Searching Rectangles

    基本思路就是二分 每条边分别二分求
    c++11 用fflush(sdtout) 不行 囧啊

    #include<bits/stdc++.h>
    using namespace std;
    
    int ans[2][4];
    int inp;
    int check(int x1,int y1,int x2,int y2) {
        printf("? %d %d %d %d
    ",x1,y1,x2,y2);
        fflush(stdout);
        scanf("%d",&inp);
        return inp;
    }
    int has(int x1,int y1,int x2,int y2) {
        if(x1 <= ans[0][0] && y1 <= ans[0][1] && x2 >= ans[0][2] && y2 >= ans[0][3]) return 1;
        return 0;
    }
    void solve(int x1,int y1,int x2,int y2,int flag){
        int l=x1, r=x2;  
        while(l<=r){
            int mid = (l+r)>>1;
            int num = check(mid,y1,x2,y2);
            if(flag &&  has(mid,y1,x2,y2) ) num--;
            if(num==1 || num==2)
                ans[flag][0] = mid, l = mid+1;
            else
                r = mid-1;
        }
        x1 = ans[flag][0];
    //  printf("x1:%d
    ",x1);
    
        l=x1,r=x2;
        while(l<=r){
            int mid = (l+r)>>1;
            int num = check(x1,y1,mid,y2);
            if( flag && has(x1,y1,mid,y2) ) num--;
            if(num==1 || num==2)
                ans[flag][2]=mid, r = mid-1;
            else
                l = mid+1;
        }
        x2 = ans[flag][2];
    //  printf("x2;%d
    ",x2);
    
        l=y1,r=y2;
        while(l<=r){
            int mid = (l+r)>>1;
            int num = check(x1,mid,x2,y2);
            if(flag &&  has(x1,mid,x2,y2) ) num--;
            if(num==1 || num==2)
                ans[flag][1]=mid, l = mid+1;
            else
                r=mid-1;
        }
        y1 = ans[flag][1];
    //  printf("y1:%d
    ",y1);
    
        l=y1,r=y2;
        while(l<=r){
            int mid = (l+r)>>1;
            int num = check(x1,y1,x2,mid);
            if(flag &&  has(x1,y1,x2,mid) ) num--;
            if(num==1 || num==2)
                ans[flag][3]=mid, r=mid-1;
            else
                l=mid+1;
        }
        y2 = ans[flag][3];
    //  printf("y2:%d
    ",y2);
    }
    
    int main(){
        int n;
        while(~scanf("%d",&n)) {
            solve(1,1,n,n,0);
            solve(1,1,n,n,1);
    
            printf("!");
            for(int i = 0; i < 2; ++i) {
                for(int j = 0; j < 4; ++j) {
                    printf(" %d",ans[i][j]);
                } 
            }printf("
    "); fflush(stdout);
        }
        return 0;
    }
    
  • 相关阅读:
    hive之insert导入分区数据
    Hive数据倾斜及优化方案
    Hive中join关键字运行机制及使用详解
    如何去编写一个定时器?
    MapReduce运行原理详解
    nfs共享服务搭建
    IDEA中Java方法的抽取
    阿里巴巴开发规约(Alibaba Java Coding Guidelines)安装介绍
    IDEA集成vue
    写给初学asp.net的新人们 新手学习经验
  • 原文地址:https://www.cnblogs.com/Basasuya/p/8433753.html
Copyright © 2011-2022 走看看