BZOJ

题意:

在二维网格图中有\(n\)个物品,每个物品有价值;但有\(m\)个警卫看管这些物品,每个警卫面朝\(y\)轴负方向,能看到一定角度(假定能够看到无穷远)。

现在每个敬畏有一个贿赂价钱,通过贿赂能让警卫闭眼。如果一个物品没被任何警卫看到,则可以取走它。

问最后获得的最大价值为多少。

思路:

  • 最直接的思路就是一个最大权闭合子图的建模,但边数为\(O(n^2)\),强行搞直接\(T\)飞。
  • 然后呢...因为最小割等于最大流,又因为这个是二分图,所以我们可以模拟最大流(想不到...)。
  • 但是我们需要知道每个警察看管着哪些物品,这里我们将警察视角强行变为\(90^o\)(旋转坐标系),然后将平面逆时针旋转\(90^o\),最终就得到了如下样子:

  • 那么问题就转化为:每个警卫能够给出\(b_i\)的流量,每个物品能接受\(a_i\)的流量,求最大流。
  • 直接按\(x\)从大到小考虑每个警卫,类似于扫描线,在这个过程中不断加入物品。对于每个警卫,显然优先考虑\(y\)较大的那些点是更优的。然后就模拟最大流过程即可。
  • 可以用\(set\)来维护信息,复杂度为\(O(nlogn)\)。

PS:旋转坐标轴的时候其实只需要单独分析向量就行,另外有一个公式,假设现在有两个坐标系,一个为普通的直角坐标系,另一个是旋转过后的,它们的基底矩阵分别为\(E,A\),那么假设点\((x,y)\)为基底\(E\)下的点,点\((a,b)\)为基底\(A\)下的点。有公式:\((x,y)E=(a,b)A\),即这两个点在我们看来是同一个点,只是在不同的坐标系下有着不同的表示。知道这个就可以愉快地旋转坐标系了。

代码如下:

/*
* Author: heyuhhh
* Created Time: 2019/10/30 21:16:50
*/
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
//head
const int N = 2e5 + 5; int n, m, w, h;
struct Node{
ll x, y, z;
bool operator < (const Node &A) const{
return x < A.x;
}
}a[N], b[N]; void run(){
cin >> w >> h;
ll ans = 0;
for(int i = 1; i <= n; i++) {
ll x, y, z;
cin >> x >> y >> z;
ans += z;
x = 1ll * x * h;
y = 1ll * y * w;
a[i] = Node{x + y, x - y, z};
}
for(int i = 1; i <= m; i++) {
ll x, y, z;
cin >> x >> y >> z;
x = 1ll * x * h;
y = 1ll * y * w;
b[i] = Node{x + y, x - y, z};
}
sort(a + 1, a + n + 1);
sort(b + 1, b + m + 1);
set <pii> S;
for(int i = 1, j = 1; i <= m; i++) {
while(j <= n && a[j].x <= b[i].x) {
S.insert(MP(a[j].y, a[j].z));
++j;
}
ll c = b[i].z;
while(c) {
set <pii> :: iterator it = S.lower_bound(MP(b[i].y, 0));
if(it == S.end()) break;
pii now = *it;
S.erase(it);
ll tmp = min(c, now.se);
now.se -= tmp;
c -= tmp;
ans -= tmp;
if(now.se > 0) S.insert(now);
}
dbg(ans);
}
cout << ans << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
while(cin >> n >> m) run();
return 0;
}

【BZOJ3716】[PA2014]Muzeum(贪心+网络流)的更多相关文章

  1. BZOJ 3716 [PA2014]Muzeum 贪心SET最大闭合子图

    看上去像是一个最大权闭合子图裸题但是数据太大 我们可以先把守卫的视野转换到第二象限(每个守卫可以看到横坐标比他小 纵坐标比他大的宝物) 然后按X从小到大 再按Y从大到小排 这样我们就可以按SORT序遍 ...

  2. 【BZOJ3716】[PA2014]Muzeum(贪心,网络流)

    [BZOJ3716][PA2014]Muzeum(贪心,网络流) 题面 BZOJ 题解 很明显可以写最大权闭合子图,然后会\(TLE\)成傻逼. 为了方便,就把一个警卫能够看到的范围处理一下(把坐标系 ...

  3. [PA2014]Muzeum

    [PA2014]Muzeum 题目大意: 有\(n\)件展品和\(m\)个警卫,每件展品有一个坐标\((x_i,y_i)\)和价值\(v_i\),每个警卫的坐标为\((x_i,y_i)\).每个警卫面 ...

  4. bzoj3716/4251 [PA2014]Muzeum

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3716 http://www.lydsy.com/JudgeOnline/problem.ph ...

  5. bzoj 3716: [PA2014]Muzeum

    Description 吉丽的漫展有n件手办和m名警卫.建立平面直角坐标系,每个手办和警卫都可以看做一个点.警卫们的目光都朝着y轴负方向,且都有相同大小的视角.警卫可以看见自己视角内(包括边界上的点) ...

  6. [bzoj3709][PA2014]Bohater_贪心

    bzoj-3709 PA-2014 Bohater 题目大意:在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i ...

  7. 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心

    [BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...

  8. bzoj3717 [PA2014]Pakowanie 贪心+状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3717 题解 这道题大概也就只能算常规的状压 DP 吧,但是这个状态和转移的设计还是不是很好想. ...

  9. bzoj3709: [PA2014]Bohater 贪心

    ~~~题面~~~ 题解: 首先有一个比较明显的策略,肯定先要把能带给自己受益的先选完,然后再以最佳状态去打那些会给自己带来损失的怪. 对于前一部分(可以带来受益的怪),显然我们需要先从代价小的打起,因 ...

随机推荐

  1. 201871010111-刘佳华《面向对象程序设计(java)》第十一周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十一周学习总结 实验九  泛型程序设计技术 实验时间 2019-11-8 1.实验目的与要求 (1) 理解泛型概念: (2 ...

  2. office 小技巧

    1. 数据匹配 VLOOKUP 例一:如图,将左表(sheet1)的e列关联到右表(sheet2),条件为: sheet2.字段名 = sheet1.D 公式:=VLOOKUP(sheet2!D2:D ...

  3. 20191102 「HZOJ NOIP2019 Round #12」20191102模拟

    先开坑. md原题写挂我也真是... 100+20+10 白夜 打表大法吼 显然,不在环上的点对答案的贡献是 \((k-cycle)^{k-1}\) . 打表得到环上的递推式,矩阵一下乘起来就好了. ...

  4. php 学习笔记之日期时间操作一箩筐

    格式化日期时间 date : 格式化日期时间 场景 将当前日期时间或者特定日期时间格式化输出为特定格式的字符串,常用于人性化展示信息. 说明 返回给定时间戳格式化后所产生的日期时间字符串,如果没有给出 ...

  5. bootstrap-editable 中关于onEditableSave 回调

    问题描述 在对bootstrap-editable 进行编辑时,有两种使用方法:一种直接在每一个column中进行编辑保存,例如:{ title:'标题', field:'title', width: ...

  6. (转)dnSpy 强大的.Net反编译软件

    目录 1. Debug外部引用的Dll文件2. 调试应用程序3. 修改exe文件的内容 作者:D.泡沫 一说起.net的反编译软件,大家首先想到的就是Reflector,ILSpy,dotPeek等等 ...

  7. 一张图搞定 .NET Framework, .NET Core 和 .NET Standard 的区别

    最近开始研究.NET Core,有张图一看就能明白他们之前的关系. 上图己经能够说明.NET Framework和.NET Core其实是实现了 .NET Standard相关的东西,或者说Frame ...

  8. Java自学-I/O 控制台输入流System.in

    Java 控制台输入流 System.in和Scanner System.out 是常用的在控制台输出数据的 System.in 可以从控制台输入数据 步骤 1 : System.in package ...

  9. 【spring】spring aop

    Aspect-Oriented Programming (AOP) 一.官方介绍 通过提供另一种考虑程序结构的方式,面向方面编程(AOP)补充了面向对象编程(OOP).OOP中模块化的关键单元是类,而 ...

  10. Qt播放音视频文件报错DirectShowPlayerService::doRender: Unresolved error code 0x80040266或DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()

    使用QMediaPlayer和QVideoWidget QHBoxLayout *m_layout=newQHBoxLayout(this); QMediaPlayer *m_player = new ...