FZU 2187 回家种地(矩形面积并)
来源:互联网 发布:python文本分析和提取 编辑:程序博客网 时间:2024/05/22 07:52
题意:
求的是只覆盖了一次的面积并是多少。
解析:
相对于普通的面积并来说,就是求
cover==1 的长度,去掉了cover>=1 的长度。
参考了网络上的做法,用sum维护当前区间cover>=1 的长度,single维护cover==1 的长度。
其他地方和普通的面积并一模一样,只是在pushUp的时候稍微多了对single的维护而已
#include <cstdio>#include <cstring>#include <algorithm>#define ls (o<<1)#define rs (o<<1|1)#define lson ls, L, M#define rson rs, M+1, Rusing namespace std;typedef __int64 ll;const int maxn = (int)2e5 + 5;struct Line { ll l, r, h, d; Line() {} Line(ll l, ll r, ll h, ll d) : l(l), r(r), h(h), d(d) {}} line[maxn];bool cmp(Line a, Line b) { return a.h < b.h;}int n, m, tot;ll X[maxn];ll sum[maxn<<2], single[maxn<<2];int cover[maxn<<2];void build(int o, int L, int R) { sum[o] = single[o] = cover[o] = 0; if(L == R) return ; int M = (L + R)/2; build(lson); build(rson);}inline void pushUp(int o, int L, int R) { if(cover[o]) { sum[o] = X[R+1] - X[L]; if(cover[o] == 1) single[o] = sum[o] - sum[ls] - sum[rs]; else single[o] = 0; }else if(L == R) sum[o] = single[o] = 0; else { sum[o] = sum[ls] + sum[rs]; single[o] = single[ls] + single[rs]; }}void modify(int o, int L, int R, int ql, int qr, int d) { if(ql <= L && R <= qr) { cover[o] += d; pushUp(o, L, R); return ; } int M = (L + R)/2; if(ql <= M) modify(lson, ql, qr, d); if(qr > M) modify(rson, ql, qr, d); pushUp(o, L, R);}int find(int x) { int L = 0, R = tot-1; while(L <= R) { int M = (L + R) >> 1; if(X[M] == x) return M; if(X[M] < x) L = M + 1; else R = M - 1; } return -1; }int main() { int T, cas = 1; int x1, y1, x2, y2; scanf("%d", &T); while(T--) { m = tot = 0; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); line[m] = Line(x1, x2, y1, 1); X[m++] = x1; line[m] = Line(x1, x2, y2, -1); X[m++] = x2; } sort(X, X+m); tot = unique(X, X+m) - X; sort(line, line+m, cmp); build(1, 0, tot-1); ll ans = 0; int ql, qr; for(int i = 0; i < m; i++) { ql = find(line[i].l); qr = find(line[i].r) - 1; modify(1, 0, tot-1, ql, qr, line[i].d); ans += single[1] * (line[i+1].h - line[i].h); } printf("Case %d: %I64d\n", cas++, ans); } return 0;}
0 0
- FZU 2187 回家种地(矩形面积并)
- 矩形面积并、矩形面积交、矩形周长并(线段树、扫描线总结)
- 矩形面积并、矩形面积交、矩形周长并(线段树、扫描线总结)
- 矩形面积的并(交)
- HDU 1542(矩形面积并)
- POJ 1151(矩形面积并)
- hdu1542 Atlantis(矩形面积并)
- hdu 1542 Atlantis(矩形面积并)
- HDU 1542 Atlantis(矩形面积并)
- HDU 1542 Atlantis (矩形面积并)
- poj3277 City Horizon(矩形面积并)
- 矩形面积并
- hdu3265 矩形面积并
- hdu1542 矩形面积并
- 矩形的面积并
- 矩形面积并 (hdu1542)
- 矩形面积求并
- poj1151矩形面积并
- 选取命令:cut,grep
- HDU1698 Just a Hook
- The least one
- android 中resources管理
- NYOJ 236 心急的c小加
- FZU 2187 回家种地(矩形面积并)
- IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
- Linux中查看CPU信息
- eclipes下NDK调试出现Unknown Application ABI:Unable to detect application ABI's错误的解决
- poj2038Fractal盒分形深搜递归
- ios 之 图片压缩 与剪切
- 留言气泡效果的关键之stretchableImageWithLeftCapWidth函数
- poj 3259 Wormholes 【判断负环】
- JAVA简单的群聊例子