JAVA判断平面重合_矩形重叠

37

/*

无论何种情况,重叠区域也是四条边组成。

而且是取自与n的矩形中的四条。

所以遍历边的交点即可。

*/

import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

int n = in.nextInt();

int[] x1 = new int[n];

int[] y1 = new int[n];

int[] x2 = new int[n];

int[] y2 = new int[n];

int xmin = Integer.MAX_VALUE;

int xmax = Integer.MIN_VALUE;

int ymin = Integer.MAX_VALUE;

int ymax = Integer.MIN_VALUE;

for (int i = 0; i < n; i++)

x1[i] = in.nextInt();

for (int i = 0; i < n; i++)

y1[i] = in.nextInt();

for (int i = 0; i < n; i++)

x2[i] = in.nextInt();

for (int i = 0; i < n; i++)

y2[i] = in.nextInt();

int ans = 0;

int cnt = 0;

for (int x : x1)

for (int y : y1) {

for (int i = 0; i < n; i++) {

if (x >= x1[i] && x < x2[i] && y >= y1[i] && y < y2[i])

cnt++;

}

if (cnt > ans)

ans = cnt;

cnt = 0;

}

System.out.println(ans);

}

}

发表于 2019-06-26 13:15:59

回复(26)

53

注意判断重叠矩形数量最多的地方:遍历所有可能包含的点,看一下有多少矩形包含它

注:重叠数量最多的地方肯定是一块矩形区域

误区:A和B交,B和C交,但是A不和C交 --- B同时和A,C交, 但是重叠区域只为1

代码如下: import sys

lines = sys.stdin.readlines()

n = int(lines[0])

x1 = list(map(int,lines[1].split()))

y1 = list(map(int,lines[2].split()))

x2 = list(map(int,lines[3].split()))

y2 = list(map(int,lines[4].split()))

# 遍历所有点的组合(包含了矩形所有角以及交点),看一下有多少矩形包含它

res = 1

for x in x1+x2:

for y in y1+y2:

cnt = 0

for i in range(n):

if x > x1[i] and y > y1[i] and x <= x2[i] and y <= y2[i]:

cnt += 1

res = max(res,cnt)

print(res)

编辑于 2018-03-29 10:28:39

回复(23)

16

O(n^2logn)算法。

思路是首先对所有矩形排序,按照底边坐标值升序。

考虑到若将平面按照所有矩形的的底边坐标值横向划分,每个划分中的最大重合情况总是出现在该划分底部,且等价一维的区间重合问题。如图所示:

5e4bcd44dd47a44286d840a6e1a52a10.png

因此,我们每次迭代将下一个或多个底边坐标值最低的矩阵加入队列,并将整个在当前最低坐标值之下的矩形从队列中移除,然后用区间重合的算法计算队列中矩形在目前划分的重合数量。

以下是代码: #include

#include

#include

#include

#include

#include

#include

using namespace std;

// square overlap

class Square{

public:

int left, right, up, down;

bool operator

return down < x.down;

}

};

bool leftto(Square a, Square b){

return a.left < b.left;

}

void eraselower(vector &a, int ybound){

int deln = 0, i = 0, n = a.size();

while(i + deln < n){

if(a[i].up<=ybound)

swap(a[i], a[n-(++deln)]);

else

++i;

}

a.erase(a.end()-deln, a.end());

}

int main(){

int n;

cin>>n;

vector sqs(n), row;

for(int i=0; i

cin>>sqs[i].left;

for(int i=0; i

cin>>sqs[i].down;

for(int i=0; i

cin>>sqs[i].right;

for(int i=0; i

cin>>sqs[i].up;

sort(sqs.begin(), sqs.end());

int sn = 0, curdown = 0, res = 0;

while(sn

curdown = sqs[sn].down;

while(sn

row.push_back(sqs[sn++]);

eraselower(row, curdown);

sort(row.begin(), row.end(), leftto);

vector rights;

for(Square x:row){

rights.erase(rights.begin(), upper_bound(rights.begin(), rights.end(), x.left));

rights.insert(upper_bound(rights.begin(), rights.end(), x.right), x.right);

if(res < rights.size()) res = rights.size();

}

}

cout<

}

编辑于 2018-04-12 15:30:39

回复(12)

8

考虑把每个矩形的左下角和右上角坐标离散化,最终N个矩形可以看成存在于一个2N*2N的方格中,方格中每个点的权值为该点出现矩形的个数,扫一遍维护最大值即为答案。 #include

using namespace std;

const int N = 55;

int x1[N],y11[N],x2[N],y2[N],X[2*N],Y[2*N];

int mp[2*N][2*N],p,q,lx,ly,rx,ry;

void color(){ ///将矩形出现在方格中的点全部+1

for(int i=lx+1;i<=rx;i++)for(int j=ly+1;j<=ry;j++){ ///由于边界不算,所以从lx+1开始

mp[i][j]++;

}

}

int main(){

int n;

scanf("%d",&n);

for(int i=0;i

for(int i=0;i

for(int i=0;i

for(int i=0;i

sort(X,X+2*n);   ///离散化过程

sort(Y,Y+2*n);

p = unique(X,X+2*n)-X;

q = unique(Y,Y+2*n)-Y;

for(int i=0;i

lx = lower_bound(X,X+p,x1[i])-X; ///查询离散化之后出现在方格的左下角和右上角坐标

ly = lower_bound(Y,Y+q,y11[i])-Y;

rx = lower_bound(X,X+p,x2[i])-X;

ry = lower_bound(Y,Y+q,y2[i])-Y;

color();

}

int ans = 1;

for(int i=0;i

printf("%d\n",ans);

return 0;

}

发表于 2019-06-28 09:36:38

回复(3)

12

看n的范围就能知道这道题可以支持几乎所有的多项式复杂度的算法了,我的算法是O(n^3)的复杂度。其实可以做到O(n^2logn),但是要用到线段树,对于n<=50的规模来说可能会因为常数大程序反而跑得更慢。

首先因为坐标的范围是1e9,因此第一步肯定是对坐标进行离散化,我们存下所有的x坐标和y坐标,然后分别进行排序。然后我们得到了两个数组,一个是x坐标的数组,一个是y坐标的数组,分别都有2n个整数,这2个数组把平面分成了(2n-1)*(2n-1)个格子。所有的初始矩形都由这些格子组成

我们可以取这些格子的对角线中点(共(2n-1)(2n-1)个)代表这些格子,然后考虑这些这些点分别包含在多少个矩形中。然后求出被覆盖最多次的格子就是答案了。

发表于 2018-03-28 01:50:20

回复(7)

3

可能是全网最快解法 O(NlogN)

先离散化纵坐标,然后用扫描线算法,用线段树维护区间最大值。

排序纵坐标的复杂度O(NlogN),扫描线扫描复杂度O(N)*线段树操作复杂度O(logN)。

代码如下:

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define LL long long

#define M 1000000007

#define M2 998244353

#define MAXN 105

#define eps 1e-7

using namespace std;

struct Node {

int s, e, val, tag;

};

Node seg[MAXN*4];

void build(int idx, int s, int e) {

seg[idx].s = s, seg[idx].e = e;

int m = (s+e)/2;

if (s == e) return;

build(idx*2, s, m), build(idx*2+1, m+1, e);

}

void update(int idx, int start, int end, int off) {

//cout <

if (start == seg[idx].s && end == seg[idx].e) {

seg[idx].tag += off;

seg[idx].val += off;

return;

}

int m = (seg[idx].s+seg[idx].e)/2;

if (seg[idx].tag) {

update(idx*2, seg[idx].s, m, seg[idx].tag);

update(idx*2+1, m+1, seg[idx].e, seg[idx].tag);

seg[idx].tag = 0;

}

if (end <= m) update(idx*2, start, end, off);

else if (start > m) update(idx*2+1, start, end, off);

else {

update(idx*2, start, m, off);

update(idx*2+1, m+1, end, off);

}

seg[idx].val = max(seg[idx*2].val, seg[idx*2+1].val);

}

int query(int idx, int start, int end) {

if (seg[idx].s == start && seg[idx].e == end) {

return seg[idx].val;

}

int m = (seg[idx].s+seg[idx].e)/2;

if (seg[idx].tag) {

update(idx*2, seg[idx].s, m, seg[idx].tag);

update(idx*2+1, m+1, seg[idx].e, seg[idx].tag);

seg[idx].tag = 0;

}

if (end <= m) return query(idx*2, start, end);

else if (start > m) return query(idx*2+1, start, end);

else return max(query(idx*2, start, m), query(idx*2+1, m+1, end));

}

int main() {

ios::sync_with_stdio(false);

cin.tie(0);

int n;

cin >> n;

vector x1(n), y1(n), x2(n), y2(n);

vector ys;

for (int i = 0; i > x1[i];

for (int i = 0; i > y1[i];

for (int i = 0; i > x2[i];

for (int i = 0; i > y2[i];

for (int i = 0; i 

sort(ys.begin(), ys.end());

ys.resize(unique(ys.begin(), ys.end()) - ys.begin());

unordered_map y2i;

for (int i = 0; i 

vector> v;

for (int i = 0; i 

v.push_back({x1[i], 1, y2i[y1[i]], y2i[y2[i]]});

v.push_back({x2[i], -1, y2i[y1[i]], y2i[y2[i]]});

}

sort(v.begin(), v.end(), [](const vector& v1, const vector& v2) {

return v1[0] 

});

int res = 0;

build(1, 0, ys.size());

int lastx = INT_MIN;

for (auto& vv: v) {

if (lastx == INT_MIN && vv[1] 

//cout <

if (vv[0] != lastx) {

//cout <

res = max(res, query(1, 0, ys.size()));

lastx = vv[0];

}

update(1, vv[2], vv[3]-1, vv[1]);

}

//cout <

res = max(res, query(1, 0, ys.size()));

cout <

return 0;

}

发表于 2019-10-24 22:28:32

回复(0)

5

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.Scanner;

class edge implements Comparable{

Integer left;

Integer right;

Integer height;

Integer value;

edge(int left,int right,int height,int value){

this.left=left;

this.right=right;

this.height=height;

this.value=value;

}

@Override

public int compareTo(Object o) {

return Integer.compare(height,((edge)o).height);

}

}

public class Main {

public static void main(String[] args){

ArrayList xAxial=new ArrayList();

ArrayList allEdges=new ArrayList<>();

Scanner in=new Scanner(System.in);

int n=in.nextInt();

int[] x1=new int[n];

int[] x2=new int[n];

int[] y1=new int[n];

int[] y2=new int[n];

for(int i=0;i

x1[i]=in.nextInt();

xAxial.add(x1[i]);

}

for(int i=0;i

y1[i]=in.nextInt();

}

for(int i=0;i

x2[i]=in.nextInt();

xAxial.add(x2[i]);

}

for(int i=0;i

y2[i]=in.nextInt();

}

for(int i=0;i

allEdges.add(new edge(x1[i],x2[i],y1[i],1));

allEdges.add(new edge(x1[i],x2[i],y2[i],-1));

}

Collections.sort(xAxial);

Collections.sort(allEdges);

ArrayList count=new ArrayList();

for(int i=0;i!=xAxial.size()-1;++i)

count.add(0);

int result=1;

for(edge tmp : allEdges){

Integer index=xAxial.indexOf(tmp.left);

while(xAxial.get(index)

count.set(index,count.get(index)+tmp.value);

if(count.get(index)>result){

result=count.get(index);

}

++index;

}

}

System.out.println(result);

}

}

编辑于 2018-03-28 16:21:31

回复(2)

2

#include 

using namespace std;

int main()

{

//读取输入

int n;

cin>>n;

int x1[n],y1[n],x2[n],y2[n];//左下x,左下y,右上x,右下y

for(int i = 0;i

cin>>x1[i];

for(int i = 0;i

cin>>y1[i];

for(int i = 0;i

cin>>x2[i];

for(int i = 0;i

cin>>y2[i];

int result = 0;

//二维转一维,遍历左下角点的x和y,看这些点在多少个矩形内

for(int x: y1)

for(int y: y1)

{

int cnt =0;

for(int j=0;j

{

//注意判断条件,一开一闭,否则两个完全重合的矩形会多计算一次

if(x>=x1[j]&&x=y1[j]&&y

cnt++;

}

result = max(cnt,result);

}

cout<

return 0;

}

发表于 2019-09-07 10:04:25

回复(4)

2

import sys

n=int(sys.stdin.readline().strip())

x1=list(map(int,sys.stdin.readline().strip().split()))

y1=list(map(int,sys.stdin.readline().strip().split()))

x2=list(map(int,sys.stdin.readline().strip().split()))

y2=list(map(int,sys.stdin.readline().strip().split()))

res = 1

for x in x1+x2:

for y in y1+y2:

cnt = 0

for i in range(n):

if x > x1[i] and y > y1[i] and x <= x2[i] and y <= y2[i]:

cnt += 1

res = max(res,cnt)

print(res)

发表于 2019-08-25 05:25:57

回复(0)

2

"""

重叠的区域角横坐标x必然是【x1,x2】中某个值

重叠的区域角横坐标y必然是【y1,y2】中某个值

遍历所有坐标点(x,y),由于重叠不考虑边界和角落

在 x_range, y_range = x ± δ, y ± δ (δ< 1)

x1[i] < x_range < x2[i] and y1[i] < y_range < y2[i] 范围内计算重叠个数

或者 x1[i] < x <= x2[i] and y1[i] < y <= y2[i] ,等号的位置等同于上式的±号。

取所有坐标点最大的重叠个数即为所求

"""

import sys

if __name__ == "__main__":

# sys.stdin = open('input.txt', 'r')

n = int(input().strip())

x1 = list(map(int, input().strip().split()))

y1 = list(map(int, input().strip().split()))

x2 = list(map(int, input().strip().split()))

y2 = list(map(int, input().strip().split()))

ans = 1

for x in x1 + x2:

for y in y1 + y2:

x_range, y_range = x - 0.1, y - 0.1

cnt = 0

for i in range(n):

if x1[i] < x_range < x2[i] and y1[i] < y_range < y2[i]:

# if x1[i] < x <= x2[i] and y1[i] < y <= y2[i]:

cnt += 1

ans = max(ans, cnt)

print(ans)

发表于 2019-07-02 19:55:20

回复(3)

2

//通过了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

class juxing

{

public:

int lb_x;

int lb_y;

int rt_x;

int rt_y;

juxing(int a, int b, int c, int d): lb_x(a), lb_y(b), rt_x(c), rt_y(d){}

};

int main()

{

int n;

scanf("%d", &n);

vector lbX(n);

for (int i = 0; i < n; i++)

scanf("%d", &lbX[i]);

vector lbY(n);

for (int i = 0; i < n; i++)

scanf("%d", &lbY[i]);

vector rtX(n);

for (int i = 0; i < n; i++)

scanf("%d", &rtX[i]);

vector rtY(n);

for (int i = 0; i < n; i++)

scanf("%d", &rtY[i]);

vector AllJuXing;

for (int i = 0; i < n; i++)

AllJuXing.push_back(juxing(lbX[i], lbY[i], rtX[i], rtY[i]));

vector XX;

for (int i = 0; i < n; i++)

{

XX.push_back(lbX[i]);

XX.push_back(rtX[i]);

}

vector YY;

for (int i = 0; i < n; i++)

{

YY.push_back(lbY[i]);

YY.push_back(rtY[i]);

}

int count = 0, ret = 0;

for (int i = 0; i < XX.size(); i++)

{

for (int j = 0; j < YY.size(); j++)

{

for (int k = 0; k < AllJuXing.size(); k++)

{

if (XX[i] >= AllJuXing[k].lb_x && XX[i] < AllJuXing[k].rt_x && YY[j] >= AllJuXing[k].lb_y && YY[j] < AllJuXing[k].rt_y)

count ++;

}

ret = max(ret, count);

count = 0;

}

}

cout<

return 0;

}

编辑于 2018-03-28 17:30:32

回复(0)

1

import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

int n = in.nextInt();

int[] x1 = new int[n];

int[] y1 = new int[n];

int[] x2 = new int[n];

int[] y2 = new int[n];

for (int i = 0; i < n; i++)

x1[i] = in.nextInt();

for (int i = 0; i < n; i++)

y1[i] = in.nextInt();

for (int i = 0; i < n; i++)

x2[i] = in.nextInt();

for (int i = 0; i < n; i++)

y2[i] = in.nextInt();

int result = 0;

int temp = 0;

// 遍历所有左下焦点(包括矩形延长线,统计每个焦点在多少个矩形内部,计算最大值)

for (int x : x1){

for (int y : y1) {

// (x,y)为可能的焦点

// 遍历所有矩形

for (int i = 0; i < n; i++) {

// 如果交点在内部

if (x >= x1[i] && x <= x2[i] && y >= y1[i] && y <= y2[i]) {

// 在内部的交点不能与该矩形右上重合

if (x == x2[i] && y == y2[i] )

continue;

temp += 1;

}

}

if (temp > result) {

result = temp;

}

temp = 0;

}

}

System.out.println(result);

}

}

发表于 2020-02-25 21:19:04

回复(0)

1

#include 

using namespace std;

int main(){

int n;

cin>>n;

int x1[n],y1[n],x2[n],y2[n];

for(int i=0;i

cin>>x1[i];

for(int i=0;i

cin>>y1[i];

for(int i=0;i

cin>>x2[i];

for(int i=0;i

cin>>y2[i];

int cnt = 0, s = 0;

for(int i=0;i

for(int j=0;j

for(int k=0;k

if(x1[i]>=x1[k] && x1[i]=y1[k] && y1[j]

cnt++;

s = max(s, cnt);

cnt = 0;

}

}

cout<

return 0;

}

发表于 2019-09-24 00:00:59

回复(0)

1

看了很多答案,发现有些地方解释的不是很清楚,所以再提交一份我个人认为还算清楚的答案。首先对于矩形相交情况可分为以下4种(分类可能并不严格):

1.两矩形角落部分相交

2.两矩形上下边部分相交或者左右边部分相交

3.一矩形被另外一矩形包含

4.两矩形十字相交,或者斜十字相交

可以大概画图辅助思考一下,如果几个矩形重叠,则必然有一个边角点,或者相交点同时在这几个矩形的范围内(比较直观的一种总结)。

以下是代码部分:

#include

#include

#include

using namespace std;

int main()

{

int res=0;

int n;

cin>>n;

vector x1(n);

vector y1(n);

vector x2(n);

vector y2(n);

vector x(2*n);

vector y(2*n);

for(int i=0;i

{

cin>>x1[i];

x[i]=x1[i];

}

for(int i=0;i

{

cin>>y1[i];

y[i]=y1[i];

}

for(int i=0;i

{

cin>>x2[i];

x[n+i]=x2[i];

}

for(int i=0;i

{

cin>>y2[i];

y[n+i]=y2[i];

}

//总结所有矩形相交的情况,可以通过某一矩形的的边角点或者某一矩形和另外一矩形的交点

//在几个矩形范围内来计量重叠矩形个数

for(int i=0;i<2*n;i++)

for(int j=0;j<2*n;j++)

{

int tmp=0;

//去掉无意义的射线相交点,虽然不去掉也不会影响结果,但终究是无意义的情况

if(!(x1[i%n]<=x[i]&&x[i]<=x2[i%n]&&y1[i%n]<=y[j]&&y[j]<=y2[i%n]))

continue;

//遍历所有矩形,看我们列举出的点最多被几个矩形包含

for(int k=0;k

{

//这里只有一个方向是包含的,因为对于边界和角落相交并不属于矩形重叠

if(x1[k]<=x[i]&&x[i]

tmp++;

}

res=max(res,tmp);

}

cout<

}

发表于 2019-09-15 22:00:39

回复(2)

1

#include

#include

using namespace std;

void solver(){

int n;

cin >> n;

vector x1(n,0);//x1,x2表示左下角的点的横纵坐标

vector x2(n,0);

vector y1(n,0);//y1,y2表示左下角的点的横纵坐标

vector y2(n,0);

vector a(2*n,0);//存储所有的横坐标

vector b(2*n,0);//存储左右的纵坐标

for(int i = 0; i < n; i++) {

cin >> x1[i];

a[i] = x1[i];

}

for(int i = 0; i < n; i++) {

cin >> y1[i];

b[i] = y1[i];

}

for(int i = 0; i < n; i++) {

cin >> x2[i];

a[i+n] = x1[i];

}

for(int i = 0; i < n; i++) {

cin >> y2[i];

b[i+n] = y1[i];

}

int ans = 0;

//遍历所有横纵坐标的可能组合,判断该点位于多少矩形内,则对应的矩形互相重叠

for(int x =0;x<2*n;x++) {

for(int y=0;y<2*n ;y++) {

int cnt = 0;

for(int i = 0; i < n; i++) {

//包含左下角坐标的等号是有可能两个矩阵完全重合

if(x1[i] <= a[x] && y1[i] <= b[y] && x2[i] > a[x] && y2[i] > b[y])

cnt++;

}

ans = max(ans, cnt);

}

}

cout << ans << endl;

}

int main(){

solver();

return 0;

}

发表于 2019-07-27 16:53:37

回复(1)

1

对n个点用相交关系建图,求最大团。。。

#include

#include

using namespace std;

const int maxn = 50+5;

bitset E[maxn];

int x1[maxn],y1[maxn],x2[maxn],y2[maxn];

inline void addEdge(int x,int y){

E[x].set(y);

E[y].set(x);

}

bool in(int xx,int yy,int w){

if (xx>x1[w]&&xxy1[w]&&yy

else return false;

}

bool check(int x,int y){

if (x1[x]>=x1[y]&&y1[x]>=y1[y]&&x1[x]x1[y]&&y2[x]>y1[y]||x1[x]>=x1[y]&&y2[x]<=y2[y]&&x1[x]y1[y]||x2[x]<=x2[y]&&y1[x]>=y1[y]&&x2[x]>x1[y]&&y1[x]=x1[y]&&x2[x]<=x2[y]&&y1[x]<=y2[y]&&y2[x]>=y1[y])return true;

else return false;

}

int n;

int ans ;

void dfs(int dep,bitset status){

ans = max(ans,(int)status.count());

if (dep==n+1)return;

if (ans>=status.count()+n-dep+1)return;

bitset now1=status;

bitset now2 = status;

dfs(dep+1,now2);

if (status==(status&E[dep])){

now1.set(dep);

dfs(dep+1,now1);

}

}

int main(){

//  freopen("input.in","r",stdin);

while (scanf("%d",&n)!=EOF&&n){

for (int i=1;i<=n;i++){

E[i].reset();

}

for (int i=1;i<=n;i++){

scanf("%d",x1+i);

}

for (int i=1;i<=n;i++){

scanf("%d",y1+i);

}

for (int i=1;i<=n;i++){

scanf("%d",x2+i);

}

for (int i=1;i<=n;i++){

scanf("%d",y2+i);

}

for (int i=1;i<=n;i++){

for (int j=1;j<=n;j++){

if (i==j)continue;

if (check(i,j))addEdge(i,j);

}

}

ans=0;

bitset status;

status.reset();

dfs(1,status);

printf("%d\n",ans);

}

}

编辑于 2018-04-29 17:57:03

回复(0)

1

#include

#include

#include

#include

using namespace std;

int main() {

int n;

cin >> n;

vector x1(n), y1(n), x2(n), y2(n);

for (int i = 0; i !=n; i++)

cin>>x1[i];

for (int i = 0; i != n; i++)

cin >> y1[i];

for (int i = 0; i != n; i++)

cin >> x2[i];

for (int i = 0; i != n; i++)

cin >> y2[i];

vector x = x1,y=y1;

for (int i = 0; i != n; i++)

{

x.push_back(x2[i]);

y.push_back(y2[i]);

}

sort(x.begin(), x.end());

sort(y.begin(), y.end());

vectorxx(2*n-1),yy(2*n-1);

for (int j = 0; j != 2 * n - 1; j++)

{

xx[j] = (x[j] + x[j + 1]) / 2.0;

yy[j] = (y[j] + y[j + 1]) / 2.0;

}

int max = 0;

for(int i=0; i != 2 * n-1; i++)

for (int j = 0; j != 2 * n - 1; j++)

{

int num = 0;

for (int k = 0; k != n; k++)

{

if (x1[k] < xx[i] && xx[i] < x2[k] && y1[k] < yy[j] && yy[j] < y2[k])

num++;

}

if (num > max)

max = num;

}

cout << max;

system("pause");

return 0;

}

发表于 2018-04-08 10:49:39

回复(0)

1

本套8道题全部pass的C++代码已挂到了我的GitHub(https://github.com/shiqitao/NowCoder-Solutions)

牛客网上的其他题目解答也在持续更新。 #include

#include

#include

#include

#include

using namespace std;

struct Rectangle

{

int x1, x2, y1, y2;

};

int main()

{

int n; cin >> n;

Rectangle *rect = new Rectangle[n];

int *x = new int[n * 2];

int *y = new int[n * 2];

for (int i = 0; i < n; i++) {

cin >> rect[i].x1;

x[i] = rect[i].x1;

}

for (int i = 0; i < n; i++) {

cin >> rect[i].y1;

y[i] = rect[i].y1;

}

for (int i = 0; i < n; i++) {

cin >> rect[i].x2;

x[i + n] = rect[i].x2;

}

for (int i = 0; i < n; i++) {

cin >> rect[i].y2;

y[i + n] = rect[i].y2;

}

sort(x, x + 2 * n);

sort(y, y + 2 * n);

vector vectorx;

vector vectory;

vectorx.push_back(x[0]);

vectory.push_back(y[0]);

for (int i = 1; i < 2 * n; i++) {

if (x[i] != x[i - 1]) {

vectorx.push_back(x[i]);

}

if (y[i] != y[i - 1]) {

vectory.push_back(y[i]);

}

}

delete[] x;

delete[] y;

unordered_map myMapx;

unordered_map myMapy;

for (int i = 0; i < vectorx.size(); i++) {

myMapx[vectorx[i]] = i;

}

for (int i = 0; i < vectory.size(); i++) {

myMapy[vectory[i]] = i;

}

int **map = new int*[vectorx.size()];

for (int i = 0; i < vectorx.size(); i++) {

map[i] = new int[vectory.size()];

memset(map[i], 0, sizeof(int)*vectory.size());

}

for (int i = 0; i < n; i++) {

for (int j = myMapx[rect[i].x1]; j < myMapx[rect[i].x2]; j++) {

for (int k = myMapy[rect[i].y1]; k < myMapy[rect[i].y2]; k++) {

map[j][k] += 1;

}

}

}

int maxNum = 0;

for (int i = 0; i < vectorx.size(); i++) {

for (int j = 0; j < vectory.size(); j++) {

maxNum = max(maxNum, map[i][j]);

}

}

for (int i = 0; i < vectorx.size(); i++) {

delete[] map[i];

}

delete[] map;

delete[] rect;

cout << maxNum;

return 0;

}

发表于 2018-03-28 19:15:18

回复(0)

1

有一个点有连续的两个空格 结果我split(' ')被坑了   输入好好做啊

发表于 2018-03-28 17:53:53

回复(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值