格子染色问题 java_AcWing 759. 格子染色-Java

时间复杂度 $O(n^2)$

注意:线段列表在合并后需要更新,不然会导致判断横纵线段交点时多判

import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

ArrayList rows = new ArrayList<>();

ArrayList cols = new ArrayList<>();

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

int x1 = scanner.nextInt();

int y1 = scanner.nextInt();

int x2 = scanner.nextInt();

int y2 = scanner.nextInt();

if (x1 == x2) {

cols.add(new Seg(x1, Math.min(y1, y2), Math.max(y1, y2)));

} else {

rows.add(new Seg(y1, Math.min(x1, x2), Math.max(x1, x2)));

}

}

long res = merge(rows) + merge(cols);

for (Seg row : rows) {

for (Seg col : cols) {

if (row.k >= col.l && row.k <= col.r && col.k >= row.l && col.k <= row.r) {

--res;

}

}

}

System.out.println(res);

}

public static long merge(ArrayList list) {

long res = 0;

ArrayList temp = new ArrayList<>();

list.sort((s1, s2) -> {

if (s1.k != s2.k) {

return s1.k - s2.k;

} else if (s1.l != s2.l) {

return s1.l - s2.l;

} else {

return s1.r - s2.r;

}

});

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

int j = i;

int l = Integer.MIN_VALUE + 1;

int r = Integer.MIN_VALUE;

while (j < list.size() && list.get(j).k == list.get(i).k) {

++j;

}

for (int k = i; k < j; ++k) {

if (r < list.get(k).l) {

res += r - l + 1;

if (l != Integer.MIN_VALUE + 1) {

temp.add(new Seg(list.get(i).k, l, r));

}

r = list.get(k).r;

l = list.get(k).l;

} else {

r = Math.max(r, list.get(k).r);

}

}

res += r - l + 1;

if (l != Integer.MIN_VALUE + 1) {

temp.add(new Seg(list.get(i).k, l, r));

}

i = j;

}

list.clear();

list.addAll(temp);

return res;

}

static class Seg {

int k;

int l;

int r;

Seg(int k, int l, int r) {

this.k = k;

this.l = l;

this.r = r;

}

}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值