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\) 维护即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<class T>void gi(T &x){
  4. int f;char c;
  5. for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
  6. for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
  7. }
  8. typedef long long ll;
  9. const int N=4e5+10;
  10. int n,m,W,H,v[N];ll ans=0,Y[N];
  11. struct data{
  12. ll x,y;int id;
  13. inline bool operator <(const data &p)const{
  14. if(x!=p.x)return x>p.x;
  15. return id<p.id;
  16. }
  17. }p[N];
  18. struct comp{bool operator ()(int i,int j){return Y[i]!=Y[j]?Y[i]<Y[j]:i<j;}};
  19. set<int,comp>S;
  20. set<int,comp>::iterator it;int top=0,st[N];
  21. int main(){
  22. freopen("pp.in","r",stdin);
  23. freopen("pp.out","w",stdout);
  24. int cnt=0;ll x,y;
  25. cin>>n>>m>>W>>H;
  26. for(int i=1;i<=n+m;i++){
  27. gi(x);gi(y);gi(v[i]);
  28. x*=H;y*=W;
  29. p[++cnt]=(data){x-y,Y[i]=x+y,i};
  30. }
  31. for(int i=1;i<=n;i++)ans+=v[i];
  32. sort(p+1,p+cnt+1);
  33. for(int i=1;i<=cnt;i++){
  34. if(p[i].id<=n)S.insert(p[i].id);
  35. else{
  36. x=p[i].id;
  37. it=S.upper_bound(x);
  38. if(it==S.begin())continue;
  39. for(--it;;--it){
  40. int t=min(v[*it],v[x]);
  41. v[x]-=t;v[*it]-=t;ans-=t;
  42. if(!v[*it])st[++top]=*it;
  43. else break;
  44. if(it==S.begin())break;
  45. }
  46. while(top)S.erase(st[top--]);
  47. }
  48. }
  49. cout<<ans<<endl;
  50. return 0;
  51. }

bzoj 3716: [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. BZOJ 3721: PA2014 Final Bazarek

    3721: PA2014 Final Bazarek Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 645  Solved: 261[Submit][ ...

  5. BZOJ 3709: [PA2014]Bohater

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1050  Solved: ...

  6. 【贪心】bzoj 3709:[PA2014]Bohater

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 653  Solved:  ...

  7. BZOJ 3713: [PA2014]Iloczyn( 枚举 )

    斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- ...

  8. bzoj 3714 [PA2014]Kuglarz 最小生成树

    [PA2014]Kuglarz Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1335  Solved: 672[Submit][Status][Di ...

  9. bzoj3716/4251 [PA2014]Muzeum

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

随机推荐

  1. 《Think in Java》

    chapter 1 对象导论 面向对象程序设计(Object-oriented Programming ,OOP) chapter 2 一切都是对象 字段和方法 若类的某个成员变量是基本数据类型,即是 ...

  2. Django的文件上传以及预览、存储

    思路: 文件上传通过前端的input标签,input设置display:none属性. 内容显示需要让前端通过<img>标签读取图片内容,可以通过<label>标签连接< ...

  3. 连续bezier曲线的实现

    需求场景 一系列的坐标点,划出一条平滑的曲线 3次Bezier曲线 基本上大部分绘图工具都实现了3次Bezier曲线,4个点确定一条3次Bezier曲线.以html5中的canvas为例 let ct ...

  4. kali linux之搜索引擎Shodan

    搜索引擎: 公司新闻动态,重要雇员信息 机密文档/网络拓扑 用户名密码 目标系统软硬件技术架构 Shodan:搜索联网的设备(iot)https://www.shodan.io/ banner:htt ...

  5. 特殊用途语言特性(默认实参/内联函数/constexpr函数/assert预处理宏/NDEBUG预处理变量)

    默认实参: 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 需要特别 ...

  6. spring 学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

    spring学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试 ioc 概念 控制反转(Inversion of Control,缩写为IOC),是面向 ...

  7. SpringMVC异常的使用

    1.创建一个异常类,需要extend RuntimeException,继承父类中所有的方法 2.局部异常,仅能处理这个Controller中的异常 在Controller中添加异常处理方法 @Exc ...

  8. 多线程 NSOpeartion 的使用

    NSOperation简介 相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强 NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 ...

  9. 【Leetcode】Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. class Solution { public ...

  10. XSS攻击的防御

    XSS攻击的防御 XSS 攻击是什么 XSS 又称 CSS,全称 Cross SiteScript,跨站脚本攻击,是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式,所以容易被忽略 ...