'commit'
This commit is contained in:
101
TangDou/AcWing/SegmentTree/HDU1828_Heng.cpp
Normal file
101
TangDou/AcWing/SegmentTree/HDU1828_Heng.cpp
Normal file
@@ -0,0 +1,101 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int N = 10010;
|
||||
|
||||
struct ScanLine {
|
||||
int x1, x2, y, mark;
|
||||
const bool operator<(const ScanLine &t) const {
|
||||
if (y == t.y) return mark > t.mark;
|
||||
return y < t.y;
|
||||
}
|
||||
|
||||
} line[N];
|
||||
|
||||
struct Node {
|
||||
int l, r;
|
||||
int cnt, len;
|
||||
int c;
|
||||
bool lc, rc;
|
||||
|
||||
} tr[N << 2];
|
||||
|
||||
int b[N];
|
||||
|
||||
void pushup(int u) {
|
||||
int l = tr[u].l, r = tr[u].r;
|
||||
if (tr[u].cnt) {
|
||||
tr[u].len = b[r + 1] - b[l];
|
||||
tr[u].c = 2;
|
||||
tr[u].lc = tr[u].rc = 1;
|
||||
} else {
|
||||
tr[u].len = tr[u << 1].len + tr[u << 1 | 1].len;
|
||||
tr[u].c = tr[u << 1].c + tr[u << 1 | 1].c;
|
||||
if (tr[u << 1 | 1].lc && tr[u << 1].rc) tr[u].c -= 2;
|
||||
tr[u].lc = tr[u << 1].lc;
|
||||
tr[u].rc = tr[u << 1 | 1].rc;
|
||||
}
|
||||
}
|
||||
|
||||
void modify(int u, int l, int r, int v) {
|
||||
if (l <= tr[u].l && r >= tr[u].r) {
|
||||
tr[u].cnt += v;
|
||||
pushup(u);
|
||||
return;
|
||||
}
|
||||
int mid = (tr[u].l + tr[u].r) >> 1;
|
||||
if (l <= mid) modify(u << 1, l, r, v);
|
||||
if (r > mid) modify(u << 1 | 1, l, r, v);
|
||||
pushup(u);
|
||||
}
|
||||
|
||||
void build(int u, int l, int r) {
|
||||
tr[u].l = l, tr[u].r = r;
|
||||
if (l == r) return;
|
||||
int mid = (l + r) >> 1;
|
||||
build(u << 1, l, mid);
|
||||
build(u << 1 | 1, mid + 1, r);
|
||||
}
|
||||
|
||||
int main() {
|
||||
#ifndef ONLINE_JUDGE
|
||||
freopen("HDU1828.in", "r", stdin);
|
||||
#endif
|
||||
|
||||
ios::sync_with_stdio(false), cin.tie(0);
|
||||
int n;
|
||||
while (cin >> n) {
|
||||
memset(tr, 0, sizeof tr);
|
||||
int x1, y1, x2, y2;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
cin >> x1 >> y1 >> x2 >> y2;
|
||||
line[i * 2 - 1] = {x1, x2, y1, 1};
|
||||
line[i * 2] = {x1, x2, y2, -1};
|
||||
b[i * 2 - 1] = x1, b[i * 2] = x2;
|
||||
}
|
||||
|
||||
n <<= 1;
|
||||
|
||||
sort(line + 1, line + n + 1);
|
||||
sort(b + 1, b + n + 1);
|
||||
int tot = unique(b + 1, b + 1 + n) - b - 1;
|
||||
|
||||
build(1, 1, tot - 1);
|
||||
|
||||
LL res = 0;
|
||||
int last = 0;
|
||||
|
||||
for (int i = 1; i < n; i++) {
|
||||
int L = lower_bound(b + 1, b + tot + 1, line[i].x1) - b;
|
||||
int R = lower_bound(b + 1, b + tot + 1, line[i].x2) - b;
|
||||
modify(1, L, R - 1, line[i].mark);
|
||||
|
||||
res += (LL)tr[1].c * (line[i + 1].y - line[i].y);
|
||||
res += (LL)abs(tr[1].len - last);
|
||||
last = tr[1].len;
|
||||
}
|
||||
res += line[n].x2 - line[n].x1;
|
||||
printf("%lld\n", res);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user