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. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题

    A. Bear and Three Balls 题目连接: http://www.codeforces.com/contest/653/problem/A Description Limak is a ...

  2. PostgreSQL与MySQL的区别收集(转)

    特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例.一个实例可以管理一个或多个数据库.一台服务器可以运行多个 mysqld 实例.一个实例管理器可以监视 ...

  3. Ext.form.ComboBox常用属性详解

    Ext.form.ComboBox常用属性详解 标签: Extjs js combo js 代码 var combo = new Ext.form.ComboBox({ store : new Ext ...

  4. HDU 4579 Random Walk (解方程组)

    Random Walk Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)Total ...

  5. SD卡 TF卡 接口引脚定义

  6. MB506/MB510 ULTRA HIGH FREQUENCY PRESCALER

    MB506 ULTRA HIGH FREQUENCY PRESCALER The Fujitsu MB506 is a high frequency, up to 2.4GHz, prescaler ...

  7. XmlnsDefinitionAttribute Is Pretty Nifty

    When we want to declaratively use our custom controls or reference the types we defined in XAML, we ...

  8. 【资料】wod烟草

    注意: 1. 所有效果持续时间是整个地城 2. 某几样菸草在使用 烟雾的祝福 的时候效果只有LV1 (技能 -25), 表示该物品设计上主要是自己使用而非加给团队. SL = 技能等级 HL = 英雄 ...

  9. Silverlight:《Pro Silverlight5》读书笔记 之 XAML

    XAML Properties and Events in XAML Simple Properties and Type Converters To bridge the gap between s ...

  10. _vsnprintf在可变参数打印中的用法

    _vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...