UVA1492 - Adding New Machine(扫描线)

option=com_onlinejudge&Itemid=8&page=show_problem&category=523&problem=4238&mosmsg=Submission%20received%20with%20ID%2014379274" target="_blank" style="">题目链接

题目大意:给你N∗M个格子,这些格子中某些格子是放了旧的机器。然后问如今要在这些格子放一台1∗M的新机器,问有多少种放法。

解题思路:这题照样是能够转换成面积并来做,对于有旧机器(x。y)的格子,那么(x - M + 1,y)都是不能够放新机器的格子,还有从(H - M + 2,H)都是不能够放新机器的格子,所以覆盖的范围就要扩大。

用扫描线算出这些不能够放新机器的格子,然后用总共的格子数剪掉就得到答案。分横着放和竖着放两种情况。

注意M = 1的时候要特判。由于不存在横着和竖着两种情况。

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = 5e4 + 5;
typedef long long ll;
#define lson(x) (x<<1)
#define rson(x) ((x<<1) | 1) int x[2][maxn], y[2][maxn]; struct Node { int l, r, add, s;
void set (int l, int r, int add, int s) { this->l = l;
this->r = r;
this->add = add;
this->s = s;
}
}node[8 * maxn]; struct Line { int x, y1, y2, flag;
Line (int x, int y1, int y2, int flag) { this->x = x;
this->y1 = y1;
this->y2 = y2;
this->flag = flag;
} bool operator < (const Line& a) const {
return x < a.x;
}
}; vector<int> pos;
vector<Line> L;
int W, H, N, M; void pushup (int u) { if (node[u].add)
node[u].s = pos[node[u].r + 1] - pos[node[u].l];
else if (node[u].l == node[u].r)
node[u].s = 0;
else
node[u].s = node[lson(u)].s + node[rson(u)].s;
} void build (int u, int l, int r) { node[u].set (l, r, 0, 0);
if (l == r)
return; int m = (l + r)>>1;
build (lson(u), l, m);
build (rson(u), m + 1, r);
pushup(u);
} void update (int u, int l, int r, int v) { if (node[u].l >= l && node[u].r <= r) { node[u].add += v;
pushup(u);
return ;
} int m = (node[u].l + node[u].r)>>1;
if (l <= m)
update (lson(u), l, r, v);
if (r > m)
update (rson(u), l, r, v);
pushup(u);
} void init () { for (int i = 0; i < N; i++)
scanf ("%d%d%d%d", &x[0][i], &y[0][i], &x[1][i], &y[1][i]);
} ll solve (int w, int h, int x[2][maxn], int y[2][maxn]) { L.clear();
pos.clear();
int tmp; for (int i = 0; i < N; i++) { tmp = max(y[0][i] - M + 1, 1);
L.push_back(Line(x[0][i], tmp, y[1][i] + 1, 1));
L.push_back(Line(x[1][i] + 1, tmp, y[1][i] + 1, -1));
pos.push_back(tmp);
pos.push_back(y[1][i] + 1);
} tmp = max(1, h - M + 2);
L.push_back(Line(1, tmp, h + 1, 1));
L.push_back(Line(w + 1, tmp, h + 1, -1));
pos.push_back(tmp);
pos.push_back(h + 1); sort (L.begin(), L.end());
sort (pos.begin(), pos.end());
pos.erase (unique(pos.begin(), pos.end()), pos.end()); build(1, 0, (int)pos.size() - 1); ll ans = 0;
int l, r;
for (int i = 0; i < L.size() - 1; i++) { l = lower_bound(pos.begin(), pos.end(), L[i].y1) - pos.begin();
r = lower_bound(pos.begin(), pos.end(), L[i].y2) - pos.begin();
update(1, l, r - 1, L[i].flag);
// printf ("%d %d\n", node[1].s, L[i + 1].x - L[i].x);
ans += (ll)node[1].s * (L[i + 1].x - L[i].x);
} return ans;
} int main () { ll ans;
while (scanf ("%d%d%d%d", &W, &H, &N, &M) != EOF) { init(); if (M == 1) {
ans = 0;
for (int i = 0; i < N; i++)
ans += (ll) (x[1][i] + 1 - x[0][i]) * (y[1][i] + 1- y[0][i]);
ans = (ll)W * H - ans;
} else
ans = 2 * (ll)W * H - solve(H, W, y, x) - solve(W, H, x, y);
printf ("%lld\n", ans);
}
return 0;
}

UVA1492 - Adding New Machine(扫描线)的更多相关文章

  1. HDU 4052 Adding New Machine(矩形面积并)

    Adding New Machine Problem Description Incredible Crazily Progressing Company (ICPC) suffered a lot ...

  2. Adding New Machine ZOJ - 3540

    https://vjudge.net/problem/ZOJ-3540 错误记录: 扫描线没有考虑到同一行的要删除在前,加入在后:由于用了特殊的方式所以想当然以为不需要考虑这个问题 #include& ...

  3. HDU 4052 Adding New Machine (线段树+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4052 初始给你w*h的矩阵,给你n个矩形(互不相交),按这些矩形尺寸把初始的矩形扣掉,形成一个新的'矩 ...

  4. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  5. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. .Uva&LA部分题目代码

    1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...

  7. QEMU, a Fast and Portable Dynamic Translator-Fabrice Bellard-翻译

    Abstract We present the internals of QEMU, a fast machine emulator using an original portable dynami ...

  8. Machine Learning : Pre-processing features

    from:http://analyticsbot.ml/2016/10/machine-learning-pre-processing-features/ Machine Learning : Pre ...

  9. ON THE EVOLUTION OF MACHINE LEARNING: FROM LINEAR MODELS TO NEURAL NETWORKS

    ON THE EVOLUTION OF MACHINE LEARNING: FROM LINEAR MODELS TO NEURAL NETWORKS We recently interviewed ...

随机推荐

  1. scp使用笔记

    yum install openssh-clients 就能使用了 上传 microgolds-prodeMacBook-Pro:Desktop mg$ sudo scp /Users/mg/Desk ...

  2. mysql存储过程导入表

    运用存储过程,把用户表一数据导入用户表二 DELIMITER @@ CREATE PROCEDURE imp_to_user2() BEGIN – 声明一个标志done, 用来判断游标是否遍历完成 D ...

  3. python中获取当前位置所在的行号和函数名(转)

    http://www.vimer.cn/2010/12/%E5%9C%A8python%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E4%BD%8D%E7 ...

  4. react+redux+generation-modation脚手架搭建一个todolist

    TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...

  5. 禁止body滚动允许div滚动防微信露底

    最近遇到一个需求,页面中只有一个div允许滚动,其他内容不允许滚动. 正常来讲加上 body{height:100%;overflow: hidden;} 应该就阻止页面滚动了.可是很悲催的是手机端并 ...

  6. HTML5画:线、圆、矩形、渐变

    示例一:矩形 <!DOCTYPE html><head> <meta charset=utf-8> <title>HTML5画线.圆.矩形</ti ...

  7. PHP闭包--匿名函数

    匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. ...

  8. 解决win8/8.1系统安装.net framework 3.5出现0x800F0906代码错误

    解决方案一. 首先打开windows更新,检查是否有系统更新要安装,因为这个问题可能是导致.net 3.5无法安装的罪魁祸首,要检查windows更新,可以右键“这台电脑”点击“属性”,打开后,点击左 ...

  9. AlphaGo:用机器学习技术古老的围棋游戏掌握AlphaGo: Mastering the ancient game of Go with Machine Learning

    AlphaGo: Mastering the ancient game of Go with Machine Learning Posted by David Silver and Demis Has ...

  10. 【架构】OpenResty相关资料

    OpenResty最佳实践 在2012年的时候,我加入到奇虎360公司,为新的产品做技术选型.由于之前一直混迹在python圈子里面,也接触过nginx c模块的高性能开发,一直想找到一个兼备pyth ...