zoukankan      html  css  js  c++  java
  • 洛谷P2202 [USACO13JAN]方块重叠Square Overlap

    P2202 [USACO13JAN]方块重叠Square Overlap

    题目描述

    Farmer John is planning to build N (2 <= N <= 50,000) square fenced-in pastures on his farm, each of size exactly K x K (1 <= K <= 1,000,000). Pasture i is centered at point (x_i, y_i) with integer coordinates in the range -1,000,000...1,000,000. However, in his haste to complete his plans, FJ realizes that he may have accidentally placed two pastures in locations that overlap (by overlap, this means the two pastures share a positive area in common). No two pastures share the exact same center point.

    Given the locations of each of the planned square pastures, please help FJ compute the area shared by the two overlapping pastures. Output zero if no two squares overlap, and -1 if overlap occurs between more than a single pair of pastures.

    在一个直角坐标系中,有N个边长为K的正方形。

    给出每一个正方形的中心,请判断所有的正方形是否有重叠。

    输入数据保证每一个正方形的中心不重合

    输入输出格式

    输入格式:
    • 第1行 :两个正整数: N , K

    其中:2 <= N <= 50 000 ,1 <= K <= 1 000 000 ,K保证是偶数

    *第2 .. i+1行:每行有两个整数xi,yi,描述了第i个正方形的中心。

    其中:xi,yi均在[-1 000 000,1 000 000]内

    输出格式:

    只输出一行:

    如果没有正方形重叠,输出“0”;如果有且只有一对正方形重叠,输出它们重叠的面积;如果有两对及以上的正方形重合,输出"-1";

    注意:在输出答案后一定要输换行符!

    输入输出样例

    输入样例#1: 复制
    4 6
    0 0
    8 4
    -2 1
    0 7
    输出样例#1: 复制
    20
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #define maxn 50010
    using namespace std;
    int n,k,ans;
    struct node{
        int x,y;
    }p[maxn];
    bool cmp(node a,node b){
        if(a.x!=b.x)return a.x<b.x;
        return a.y<b.y;
    }
    int Abs(int x){
        if(x>=0)return x;
        return -x;
    }
    int check(int x,int y){
        int x1=p[x].x,x2=p[y].x;
        int y1=p[x].y,y2=p[y].y;
        if(x1==x2){
            if(y2-y1>=k)return 0;
            int d=y2-y1;
            return k*(k-d);
        }
        if(y1==y2){
            if(x2-x1>=k)return 0;
            int d=x2-x1;
            return k*(k-d);
        }
        if(Abs(x1-x2)>=k&&Abs(y1-y2)>=k)return 0;
        int mx1=max(x1-k/2,x2-k/2),mn1=min(x1+k/2,x2+k/2);
        int mx2=max(y1-k/2,y2-k/2),mn2=min(y1+k/2,y2+k/2);
        return (mx1-mn1)*(mx2-mn2);
    }
    int main(){
        freopen("Cola.txt","r",stdin);
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
        sort(p+1,p+n+1,cmp);
        int t=0;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                int now=check(i,j);
                if(now>0){
                    if(t>=1){
                        puts("-1");return 0;
                    }
                    ans+=now;
                    t++;
                }
            }
        }
        if(ans)printf("%d
    ",ans);
        else puts("0");
    }
    70分 暴力
    /*
        用一个bool变量have记录之前是否已经找到重叠正方形
        对于第一个中心i:对横坐标从小到大进行排序后再按横坐标从小到大枚举
        对于第二个中心j:枚举范围为[1,i-1],并且从后往前进行枚举,我们设一个变量temp为点j到点i的距离,那么当temp>=K时就直接跳出对j的枚举过程。如果temp<K 并且满足 |Yi-Yj|<K 且 have=false 就更新ans并标记have , 否则have=true直接输出-1即可。
    */
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #define maxn 50010
    using namespace std;
    int n,k;
    struct node{int x,y;}s[maxn];
    int ans=0,have;
    bool cmp(node a,node b){return a.x<b.x;}
    int abs(int x){
        if(x>=0)return x;
        return -x;
    }
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)scanf("%d%d",&s[i].x,&s[i].y);
        sort(s+1,s+n+1,cmp);
        for(int i=2;i<=n;i++){
            int tmp=0;
            for(int j=i-1;j>=1;j--){
                tmp+=(s[j+1].x-s[j].x);
                if(tmp>=k)break;
                if(abs(s[i].y-s[j].y)<k){
                    if(have){puts("-1");return 0;}
                    have=1;
                    ans=(k-tmp)*(k-abs(s[i].y-s[j].y));
                }
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
    100分
  • 相关阅读:
    如何快速且深入的学习一门新技术
    为什么说云原生会成为未来企业技术变迁的趋势
    高并发场景下锁的使用技巧
    开箱即用~基于.NET Core的敏捷开发框架规划
    为什么在做微服务设计的时候需要DDD?
    为什么我使用了索引,查询还是慢?
    解读中兴通信在物联网行业如何践行DDD
    服务发现技术是如何演进出来的?
    关于盘点和总结的那点事儿
    文件上传 通过 ServletContext.getRealPath()获取不到路径&war与war exploded的区别
  • 原文地址:https://www.cnblogs.com/thmyl/p/7807649.html
Copyright © 2011-2022 走看看