任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5258

数长方形

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 303    Accepted Submission(s): 159

Problem Description
小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形。小度熊可能是处女座吧,他只会将木棒横竖摆放,这样会形成很多长方形。现在给你一些横竖摆放的木棒,请你帮小度熊数一数形成了多少个长方形。

为了简化题目,一个木棒的端点不会在另一个木棒上,也就是说,木棒的端点不会在长方形上。

 
Input
第一行一个整数T,表示T组数据,不超过100组。

每组数据中,第一行是n,代表有多少个木棒,n不会超过25。接下来n行,每行4个整数x1,y1,x2,y2,代表木棒的坐标,绝对值不超过1000。

所有的木棒都是横竖摆放的,也就是说x1=x2或者y1=y2,没有长为0的木棒。

 
Output
对于每组测试数据,先输出一行

Case #i:

然后输出一个整数,代表有多少个长方形。

 
Sample Input
2
4
3 0 3 3
4 0 4 3
2 1 5 1
2 2 5 2
4
3 0 3 3
4 0 4 3
2 1 5 1
2 2 -5 2
 
Sample Output
Case #1:
1
Case #2:
0
 

解题思路:

坐标值很大,但是木棍数很少,离散化。

暴力:

记录每一根横放的棍子有多少个相同的覆盖的点。

然后遍历枚举横放的棍子的数目,查询有多少对相同的点。也就是这些横放的棍子有多少对相同的竖放的棍子,总数 C(cnt, 2) = cnt * (cnt - 1)/ 2  就是当前枚举情况可以组成的长方形数目。

注意:

一、初始化,所有数据结构。

二、每一根棍子粗存的 x y 要按照升序的顺序。

AC code:

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#define INF ox3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = ;
struct date
{
int x1, y1, x2, y2;
}node[MAXN<<];
int mmp[MAXN][MAXN];
vector<int> addd[MAXN];
vector<int> len_X;
vector<int> len_Y;
map<int, int> HX;
map<int, int> HY;
int N; void init()
{
memset(node, , sizeof(node));
memset(mmp, , sizeof(mmp));
len_X.clear();
len_Y.clear();
HX.clear();
HY.clear();
for(int i = ; i < MAXN; i++) addd[i].clear();
}
int main()
{
int T_case;
scanf("%d", &T_case);
for(int cas = ; cas <= T_case; cas++){
init();
scanf("%d", &N);
for(int i = ; i < N; i++){
scanf("%d%d%d%d", &node[i].x1, &node[i].y1, &node[i].x2, &node[i].y2); ///离散化
if(node[i].x1 > node[i].x2) swap(node[i].x1, node[i].x2);
if(node[i].y1 > node[i].y2) swap(node[i].y1, node[i].y2);
len_X.push_back(node[i].x1), len_X.push_back(node[i].x2);
len_Y.push_back(node[i].y1), len_Y.push_back(node[i].y2);
}
sort(len_X.begin(), len_X.end());
sort(len_Y.begin(), len_Y.end());
len_X.erase(unique(len_X.begin(), len_X.end()), len_X.end());
len_Y.erase(unique(len_Y.begin(), len_Y.end()), len_Y.end());
for(int i = ; i < len_X.size(); i++) HX[len_X[i]] = i;
for(int i = ; i < len_Y.size(); i++) HY[len_Y[i]] = i; for(int i = ; i < N; i++){
node[i].x1 = HX[node[i].x1], node[i].y1 = HY[node[i].y1];
node[i].x2 = HX[node[i].x2], node[i].y2 = HY[node[i].y2];
} for(int i = ; i < N; i++){ //横放的木条
if(node[i].x1 == node[i].x2){
for(int j = node[i].y1; j <= node[i].y2; j++)
mmp[node[i].x1][j] = i+;
}
}
for(int i = ; i < N; i++){ //竖放的木条
if(node[i].y1 == node[i].y2){
for(int j = node[i].x1; j <= node[i].x2; j++){
if(mmp[j][node[i].y1] != ){
addd[mmp[j][node[i].y1]].push_back(i+);
}
}
}
}
LL ans = ;
for(int i = ; i <= N; i++){
for(int j = i+; j <= N; j++){
int cnt = ;
for(int k = ; k < addd[i].size(); k++){
for(int m = ; m < addd[j].size(); m++){
if(addd[i][k] == addd[j][m]){
cnt++;
break;
}
}
}
ans+=cnt*(cnt-)/;
}
}
printf("Case #%d:\n", cas);
printf("%lld\n", ans);
}
return ;
}

HDU 5258 数长方形【离散化+暴力】的更多相关文章

  1. hdu 5258 数长方形 离散化

    数长方形 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5258 Des ...

  2. 暴力枚举-数长方形(hdu5258)

    数长方形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. Project Euler 85 :Counting rectangles 数长方形

    Counting rectangles By counting carefully it can be seen that a rectangular grid measuring 3 by 2 co ...

  4. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  5. hdu 3436 splay树+离散化*

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. 【BZOJ1201】[HNOI2005]数三角形(暴力)

    [BZOJ1201][HNOI2005]数三角形(暴力) 题面 BZOJ 洛谷 题解 预处理每个点向四个方向可以拓展的最大长度,然后钦定一个点作为三角形的某个顶点,暴力枚举三角形长度,检查这样一个三角 ...

  7. HDU 2920 分块底数优化 暴力

    其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...

  8. HDU 2601An easy problem-素数的运用,暴力求解

    id=17433" target="_blank" style="color:blue; text-decoration:none">An ea ...

  9. HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

    Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

随机推荐

  1. Enjoy coding

    Enjoy coding iTerm配置 主题选择 Solarized Dark LiquidCarbon 字体选择 Cousine for Powerline(需要安装Powerline字体库), ...

  2. git/github 代码托管图文教程

    现在都流行将代码托管到github,使用版本控制工具git,现在让我们开始一步一步的将我们本地的代码托管到github上去吧 一. git的使用 1.下载git工具 2.下载好后安装时候注意要使用vi ...

  3. 【linux相识相知】网络属性配置

    当我们拥有一个崭新的计算机的时候,第一步恐怕都是迫不及待的下载各种软件,看视频,听音乐等,这里的关键的一点是要有网络.现在的个人计算机大部分都是windows操作系统的,接入网络网络很简单,插上网线也 ...

  4. Baseball Game

    You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...

  5. BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)

    题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...

  6. LARAVEL学习--安装

    之前一直使用Codeignitor框架进行PHP的开发,Codeignitor是一个非常优秀的框架,上手简单,文档极其友好,流行程度甚高(这带来了很好的社区支持+云环境支持),很轻量,可扩展性佳,性能 ...

  7. iOS 在Host App 与 App Extension 之间发送通知

    如何从你的一个App发送通知给另一个App? (例:搜狗输入法下载皮肤完成后使用皮肤) 注:搜狗输入法是App.而键盘是Extension 当你为你的App 添加 App Extension时,如果想 ...

  8. Popularize what is heart of mobile phone?

    From: http://tech.sina.com.cn/mobile/n/2014-09-29/08399657494.shtml 只谈核数没意义 带你重新认识手机SoC 2014年09月29日  ...

  9. SCI收录的期刊查询

    SCI   收录的期刊查询(动态) 1.Science Citation Index (SCI)收录期刊查询地址:http://www.isinet.com/cgi-bin/jrnlst/jlopti ...

  10. 浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用

    简介 日志的作用是保证持久性和数据一致性,通过日志可以实现数据的Undo与Redo,因此通过日志,SQL Server不仅仅可以实现灾难恢复,还可以通过日志的Redo来实现高可用性.本篇文章主要讲述日 ...