POJ3739 Special Squares 解题报告

POJ3739 Special Squares

描述:

There are some points and lines parellel to x-axis or y-axis on the plane. If arbitrary chosen two lines parallel to x-axis and two lines parallel to y-axis, one rectangle, or sometimes a square, will be formed. If a square is formed and there is one or more point in the square or on the side of the square, the square is called a "special square". Please find the number of special squares.

输入:

The 1st line contains three positive integer n1, n2 and n3. n1 stands for the number of lines parallel to x-axis, n2 stands for the number of lines parallel to y-axis, n3 stands for the number of points.(0<n1, n2, n3≤1000)

Each of the 2nd line to (n1+1)th line gives an integer y_i (0≤y_i≤1000), means a line with equation y=y_i.
Each of the (n1+2)th line to (n1+n2+1)th line
gives an integer x_j (0≤x_j≤1000), means a line with equation x=x_j.
Each of the last three lines gives two integers px_k and py_k
(0≤px_k,py_k≤1000), means a point with coordinate (px_k, py_k).

输出:

Output one
line containing an integer specifies the number of special squares. The test
data ensures that the result is less than 2^31

样例输入:

4 4 3
0 2 4 6
0 2 4 6
1 1
3 3
6 6

样例输出

8

题目分析:

本题大意是输入一些平行于x轴,y轴的直线,和一些点,输出由这些线组成的包含有点的正方形的个数。

这是一道区域覆盖的题。本题的难点有两处:1.如何判断并统计出所有正方形(不是长方形),2.如何判断这些正方形是否包含点。

我的思路就是统计出所有的正方形,然后逐个遍历,判断其是否包含点。

第一步,对点进行预处理,统计点(0,0)到点(i,j)之间的点的个数,

第二步,讲题目中的各横纵坐标值往X轴45度投影,得到所有已知直线交叉得到的点,并将其存储在一个点数组向量中。

点数组向量v[i]中存储了第i列对角线上的交叉点。

第三部,遍历正方形,判断其是否含点。

由于点存储在点向量数组v中,故遍历这些对角线上的点即可组成正方形,如下图所示:

该图是根据样例数据画的图,蓝点代表样例给的点,另各平行线及其交点如图,交点用红色点表示,a1...a14

其中,点数组向量v[1498]中存放了点a1、a2;v[1499]中存放了点a3、a4、a5 ..... v[1502]中存放了点a13、a14。

第四步,用对角线表示其所在的对角线。其包含点的求法为,例:a7a6 = a9a6 - a9a10 - a9a3 +a9a7。(a9为原点,a6为点3)

代码如下:

 1 #include<stdio.h>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 struct point{
 7  int x;
 8  int y;
 9 };
10
11 vector<point> v[3002];
12 int n1,n2,n3,x[1500],y[1500],p[1500][1500];    //p[][]统计在该范围内点的个数
13 bool flag1[1500][1500];
14 point v1[1500];
15
16 int cmp(void const *a,void const *b)
17 {
18     return *(int *)a-*(int *)b;
19 }
20
21 int main()
22 {
23     int i,j,k,len,cnt(0),flag,temp1,ii;
24     point temp;
25
26     scanf("%d%d%d",&n1,&n2,&n3);
27     for(i=0;i<n1;i++) scanf("%d",&y[i]);
28     for(i=0;i<n2;i++) scanf("%d",&x[i]);
29     for(i=0;i<n3;i++)
30     {
31         scanf("%d%d",&v1[i].x,&v1[i].y);
32         flag1[v1[i].x][v1[i].y]=1;
33     }
34
35     qsort(y,n1,sizeof(int),cmp);
36     qsort(x,n2,sizeof(int),cmp);
37
38     for(i=0; i<n2; i++)    //对点进行预处理
39         for(j=0; j<n1; j++)
40             for(k=0;k<n3;k++)
41                 if(v1[k].x<=x[i] && v1[k].y<=y[j])
42                     p[x[i]][y[j]]++;
43
44     for(i=0; i<n2; i++)                                     //把坐标往X轴45度投影,得到所有正方形
45         for(j=0; j<n1; j++)                                 //同一条对角线上的点会存储在1个v[i]中,i表示第i条对角线
46         {
47             len=x[i]-y[j]+1500;
48             temp.x=x[i];
49             temp.y=y[j];
50             v[len].push_back(temp);
51         }
52     for(i=0; i<3002; i++)                                   //判断点是否在正方形内
53         for(j=0; j<v[i].size(); j++)                        //v[i][j] v[i][k] 为正方形左下角右上角顶点
54         {
55             flag=0;
56             for(k=j+1; k<v[i].size(); k++)
57             {
58                 ii=0;
59                 temp1 = p[v[i][k].x][v[i][k].y] -           //temp1为该正方形内点的个数
60                         p[v[i][j].x][v[i][k].y] -
61                         p[v[i][k].x][v[i][j].y];
62                 if(flag1[v[i][j].x][v[i][k].y] == 1) ii++;  //判断 (j.x, j.y) (j.x, k,y) (j.y, k.x) 三点的是否有点存在
63                 if(flag1[v[i][k].x][v[i][j].y] == 1) ii++;
64                 if(flag1[v[i][j].x][v[i][j].y] == 1) ii++;
65                 if(temp1+p[v[i][j].x][v[i][j].y]+ii > 0)
66                 {
67                     cnt+=v[i].size()-k;
68                     flag=1;
69                 }
70                 if(flag) break;
71             }
72         }
73     printf("%d\n",cnt);
74     return 0;
75 }
时间: 2024-10-05 23:34:30

POJ3739 Special Squares 解题报告的相关文章

USACO Section1.2 Palindromic Squares 解题报告

palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 把1~300中,其平方在B进制下是回文数的数进行输出.每个数x输出一行,输出B进制下的x和x²,用空格隔开. 注意,10~

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

哈理工新生赛热身赛解题报告

本次热身赛6道题目,由于没有官方解题报告,自己写了一个山寨版的解题报告,希望对学弟学妹有所帮助 期中两到签到题该校OJ上没有挂出,我在田大神的帮助下a掉了其它四题,解题报告如下所示 线段 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 10(6 users) Total Accepted: 7(6 users) Rating:  Special Judge: No Description 坐标轴上有一些点,依次给出.点与点之间要求用

解题报告 之 POJ2175 Evacuation Plan

解题报告 之 POJ2175 Evacuation Plan Description The City has a number of municipal buildings and a number of fallout shelters that were build specially to hide municipal workers in case of a nuclear war. Each fallout shelter has a limited capacity in term

解题报告 之 SOJ3312 Stockholm Knights

解题报告 之 SOJ3312 Stockholm Knights Description Time Limit: 4000 MS Memory Limit: 65536 K Description The city of Stockholm is a chessboard whose size is N*M. There are some Stockholm Knights in the city. Stockholm Knights are very special Knights. They

解题报告 之 HDU5289 Assignment

解题报告 之 HDU5289 Assignment Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to some staffs who were in the s

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共