洛谷P2202 [USACO13JAN]方块重叠Square Overlap

Posted Soda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷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>=2){
                    puts("-1");return 0;
                }
                ans+=now;
                t++;
            }
        }
    }
    if(ans)printf("%d\n",ans);
    else puts("0");
}
60分 暴力

 

以上是关于洛谷P2202 [USACO13JAN]方块重叠Square Overlap的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence

洛谷P2205 [USACO13JAN]画栅栏Painting the Fence

洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence

洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur

洛谷 P3040 [USACO12JAN]贝尔分享Bale Share

洛谷—— P1561 [USACO12JAN]爬山Mountain Climbing