bzoj 3716: [PA2014]Muzeum
Description
吉丽的漫展有n件手办和m名警卫。建立平面直角坐标系,每个手办和警卫都可以看做一个点。警卫们的目光都朝着y轴负方向,且都有相同大小的视角。警卫可以看见自己视角内(包括边界上的点)的所有手办,不用考虑视线的遮挡。
你打算抢劫吉丽的漫展,但不可被警卫发现。为了实施这次抢劫计划,你可以事先贿赂某些警卫,让他们闭上眼睛。只要某件手办不在任何睁着眼睛的警卫的视野内,你就可以偷走它。你知道每件手办的价格,以及每位警卫需要接受多少钱的贿赂。你想知道自己的最大收益是多少。
Solution
显然是一个最大权闭合子图的模型,直接网络流复杂度不对
考虑贪心模拟网络流
我们要求的就是 \sum_{v}-maxflow
最大流可以贪心
设警卫为 \(P\),宝物为 \(Z\)
那么 \(P\) 能看到 \(Z\) 当且仅当:
\(\frac{P_x-Z_x}{P_y-Z_y}<=\frac{w}{h}\)
\(\frac{Z_x-P_x}{P_y-Z_y}<=\frac{w}{h}\)
化简得:
\(h*P_x-w*P_y<=h*Z_x-w*Z_y\)
\(h*P_x+w*P_y>=h*Z_x+w*Z_y\)
把 \(x\) 都变为 \(x*h\),\(y\) 都变成 \(y*w\) 坐标变为 \((x-y,x+y)\) 之后
条件就变成了:
\(Z_x>=P_x\,\,\&\&\,\,Z_y<=P_y\)
形如:

然后贪心就行了
按照 \(x\) 从大到小做,对于每一个警卫,我们希望选择 \(y\) 尽量大的宝物,因为 \(y\) 越大受到的限制越多,我们先把限制多的给处理掉
然后以此匹配下去,直到流完了或者没有可以流的了就退出, \(set\) 维护即可
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
typedef long long ll;
const int N=4e5+10;
int n,m,W,H,v[N];ll ans=0,Y[N];
struct data{
ll x,y;int id;
inline bool operator <(const data &p)const{
if(x!=p.x)return x>p.x;
return id<p.id;
}
}p[N];
struct comp{bool operator ()(int i,int j){return Y[i]!=Y[j]?Y[i]<Y[j]:i<j;}};
set<int,comp>S;
set<int,comp>::iterator it;int top=0,st[N];
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int cnt=0;ll x,y;
cin>>n>>m>>W>>H;
for(int i=1;i<=n+m;i++){
gi(x);gi(y);gi(v[i]);
x*=H;y*=W;
p[++cnt]=(data){x-y,Y[i]=x+y,i};
}
for(int i=1;i<=n;i++)ans+=v[i];
sort(p+1,p+cnt+1);
for(int i=1;i<=cnt;i++){
if(p[i].id<=n)S.insert(p[i].id);
else{
x=p[i].id;
it=S.upper_bound(x);
if(it==S.begin())continue;
for(--it;;--it){
int t=min(v[*it],v[x]);
v[x]-=t;v[*it]-=t;ans-=t;
if(!v[*it])st[++top]=*it;
else break;
if(it==S.begin())break;
}
while(top)S.erase(st[top--]);
}
}
cout<<ans<<endl;
return 0;
}
bzoj 3716: [PA2014]Muzeum的更多相关文章
- BZOJ 3716 [PA2014]Muzeum 贪心SET最大闭合子图
看上去像是一个最大权闭合子图裸题但是数据太大 我们可以先把守卫的视野转换到第二象限(每个守卫可以看到横坐标比他小 纵坐标比他大的宝物) 然后按X从小到大 再按Y从大到小排 这样我们就可以按SORT序遍 ...
- 【BZOJ3716】[PA2014]Muzeum(贪心,网络流)
[BZOJ3716][PA2014]Muzeum(贪心,网络流) 题面 BZOJ 题解 很明显可以写最大权闭合子图,然后会\(TLE\)成傻逼. 为了方便,就把一个警卫能够看到的范围处理一下(把坐标系 ...
- [PA2014]Muzeum
[PA2014]Muzeum 题目大意: 有\(n\)件展品和\(m\)个警卫,每件展品有一个坐标\((x_i,y_i)\)和价值\(v_i\),每个警卫的坐标为\((x_i,y_i)\).每个警卫面 ...
- BZOJ 3721: PA2014 Final Bazarek
3721: PA2014 Final Bazarek Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 645 Solved: 261[Submit][ ...
- BZOJ 3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1050 Solved: ...
- 【贪心】bzoj 3709:[PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 653 Solved: ...
- BZOJ 3713: [PA2014]Iloczyn( 枚举 )
斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...
- bzoj 3714 [PA2014]Kuglarz 最小生成树
[PA2014]Kuglarz Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1335 Solved: 672[Submit][Status][Di ...
- bzoj3716/4251 [PA2014]Muzeum
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3716 http://www.lydsy.com/JudgeOnline/problem.ph ...
随机推荐
- ubuntu没有权限(不能)创建文件夹(目录)
可以在终端直接运行 sudo nautilus,弹出来的nautilus可以直接GUI操作,中途别关终端.如果遇到需要输入root密码,则输入root密码就可以启动这个图形界面了.
- vi/vim使用总结
第一部份:一般模式可用的按钮说明,光标移动.复制粘贴.搜索取代等 移动光标的方法: h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移劢一个字符 k 或 向上箭头键( ...
- loj #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...
- 再谈VS2010编译更高平台vs2012(v110),vs2015(v140)的objectARX程序
前段时间我贴了一篇vs2010批量编译vc6~vs2008的ARX版本,实际上那一篇是我在研究vs2010编译v110,v140平台的附带收获,正应了那句话,有心栽花花不开,无心插柳柳成荫,因为vs2 ...
- Effective Java 3rd.Edition 翻译
推荐序 前言 致谢 第一章 引言 第二章 创建和销毁对象 第1项:用静态工厂方法代替构造器 第2项:遇到多个构造器参数时要考虑使用构建器 第3项:用私有构造器或者枚举类型强化Singleton属性 第 ...
- 在Ninject 向构造参数中注入具有相同类型的参数
实际上这个有多种解决方法,加自定义Attribute,或Named(),但这些方式有一些侵入性,Named,要引用Ninject, 自定义Attribute,还要还要再写几行代码吗,所以使用下面的方法 ...
- EasyUI学习笔记(四)—— datagrid的使用
一.传统的HTML表格 之前我们做表格的时候是这样写的: <table > <thead> <tr> <th>编号</th> <th& ...
- git 各个区的区别
Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited) 把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用 git add 把文 ...
- React笔记:ref注意事项
[一]使用ref必须用在[类型式的组件]才起作用,用在[函数式的组件]是无效的. 下面这个例子用在了[函数式的组件]上,所以是无效的: function MyFunctionalComponent() ...
- java.math.BigDecimal cannot be cast to java.lang.String
从数据库总查询出的count(*) 函数统计的值,类型转换方法: Map<String,Integer> map = new HashMap<String,Integer>() ...