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>=)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 ;
int d=y2-y1;
return k*(k-d);
}
if(y1==y2){
if(x2-x1>=k)return ;
int d=x2-x1;
return k*(k-d);
}
if(Abs(x1-x2)>=k&&Abs(y1-y2)>=k)return ;
int mx1=max(x1-k/,x2-k/),mn1=min(x1+k/,x2+k/);
int mx2=max(y1-k/,y2-k/),mn2=min(y1+k/,y2+k/);
return (mx1-mn1)*(mx2-mn2);
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
sort(p+,p+n+,cmp);
int t=;
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
int now=check(i,j);
if(now>){
if(t>=){
puts("-1");return ;
}
ans+=now;
t++;
}
}
}
if(ans)printf("%d\n",ans);
else puts("");
}

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=,have;
bool cmp(node a,node b){return a.x<b.x;}
int abs(int x){
if(x>=)return x;
return -x;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d%d",&s[i].x,&s[i].y);
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++){
int tmp=;
for(int j=i-;j>=;j--){
tmp+=(s[j+].x-s[j].x);
if(tmp>=k)break;
if(abs(s[i].y-s[j].y)<k){
if(have){puts("-1");return ;}
have=;
ans=(k-tmp)*(k-abs(s[i].y-s[j].y));
}
}
}
printf("%d\n",ans);
return ;
}

100分

洛谷P2202 [USACO13JAN]方块重叠Square Overlap的更多相关文章

  1. 洛谷P3068 [USACO13JAN]派对邀请函Party Invitations

    P3068 [USACO13JAN]派对邀请函Party Invitations 题目描述 Farmer John is throwing a party and wants to invite so ...

  2. 洛谷 P3068 [USACO13JAN]派对邀请函Party Invitations

    P3068 [USACO13JAN]派对邀请函Party Invitations 题目描述 Farmer John is throwing a party and wants to invite so ...

  3. 洛谷P3070 [USACO13JAN]岛游记Island Travels

    P3070 [USACO13JAN]岛游记Island Travels 题目描述 Farmer John has taken the cows to a vacation out on the oce ...

  4. 洛谷 P3071 [USACO13JAN]座位Seating-线段树区间合并(判断找,只需要最大前缀和最大后缀)+分治+贪心

    P3071 [USACO13JAN]座位Seating 题目描述 To earn some extra money, the cows have opened a restaurant in thei ...

  5. 洛谷 P3071 [USACO13JAN]座位Seating(线段树)

    P3071 [USACO13JAN]座位Seating 题目链接 思路: 一开始把题给读错了浪费了好多时间呜呜呜. 因为第二个撤离操作是区间修改,所以我们可以想到用线段树来做.对于第一个操作,我们只需 ...

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

    传送门 题目大意: 开始站在原点,给出一系列操作 x L/R,表示向左或向右走几步. 最多会移动到离原点1,000,000,000单位远的地方. n次操作,n<=100000 问走过k次的地方有 ...

  7. 洛谷 P2205 [USACO13JAN]画栅栏

    这题其实没什么,但用到的算法都十分有用.做一个不恰当的比喻,这是一只必须用牛刀杀的鸡,但因为我这个蒟蒻杀不死牛,所以只能找只鸡来练练手. 题目描述 Farmer John 想出了一个给牛棚旁的长围墙涂 ...

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

    题目描述 Farmer John has devised a brilliant method to paint the long fence next to his barn (think of t ...

  9. 洛谷P3069 [USACO13JAN]牛的阵容Cow Lineup(尺取法)

    思路 考虑比较朴素的解法,枚举每个长度为\(k+1\)的区间,然后统计区间中出现次数最多的颜色.这样的话复杂度为\(O(n*k)\)的,显然不行. 观察到统计每个区间中出现次数最多的颜色中,可以只用看 ...

随机推荐

  1. Java之泛型深解

    泛型的内容确实很多,在上一篇Java之泛型浅解讲到了一些常用的泛型,但是还远远不够,上一篇的内容比较容易理解,这一篇我自己觉得更加难理解一些,因此,我还得想办法让它更加接地气更加容易理解,方便我和源宝 ...

  2. Spring JdbcTemplate详解(转)

    原文地址:http://www.cnblogs.com/caoyc/p/5630622.html   尊重原创,请访问原文地址 JdbcTemplate简介 Spring对数据库的操作在jdbc上面做 ...

  3. Skype SILK vs. iLBC vs. Speex

    对比一下这三种VOIP语音算法的特点: 1 参数与特征 2 SILK性能 关于iLBC和Speex的性能可以参考以前写的文章. 3 关于VOIP一些观点(仅代表个人观点) 1)  Skype 辛苦三年 ...

  4. uoj problem 11 ydc的大树

    题目大意: 给定一颗黑白树.允许删除一个白点.最大化删点后无法与删点前距自己最远的黑点连通的黑点个数.并求出方案数. 题解: 这道题很棒棒啊. 一开始想了一个做法,要用LCT去搞,特别麻烦而且还是\( ...

  5. bzoj 2125 最短路——仙人掌两点间最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的……必须再做一遍. 两点间的情况: 1.直 ...

  6. IDEA常用快捷键整理

    快速定位文件:   Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Alt+Shift+C,最近打开的文件 Ctrl+N,快速打开类 Ctrl+Shift+N,快速打开文件   当 ...

  7. 外置式与增量式PID模板程序(51单片机c语言)

    外置式PID模板 #define MuBiaoCS 0 //目标常数 #define CHang_aCS 0 //比例常数 #define CHang_bCS 0 //积分常数 #define CHa ...

  8. Java中继承的规则

    一.子类中对父类构造函数的调用规则 1.如果不显式指定,子类中的构造函数会默认调用父类中的无参构造 测试代码 package day07; import java.sql.Date; import j ...

  9. JS开发中的一些小技巧和方法

    生成指定范围内的随机数 当我们需要获取指定范围(min,max)内的整数的时候,下面的代码非常适合:这段代码用的还挺多的. function setRadomNum(min,max){ return ...

  10. C++之string类

    1.String对象的初始化 string s1;               默认构造函数,s1为空串 string s4(n, 'c');     将s4初始化为字符c的n个副本 string s ...