博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.1071.[SCOI2007]组队(思路)
阅读量:5065 次
发布时间:2019-06-12

本文共 1501 字,大约阅读时间需要 5 分钟。

三个限制:

\(Ah-AminH+Bv-BminV\leq C\ \to\ Ah+Bv\leq C+AminH+BminV\)
\(v\geq minV\)
\(h\geq minH\)

\(s=Ah+Bv\)。将序列按\(s\)从小到大排序。

\(n^2\)枚举\(minV,minH\)。如果固定\(minV\),从小到大枚举\(minH\)时,满足\(s\leq C+AminH+BminV\)的位置是单增的。统计答案时可以判一下是否满足\(v_i\geq minV\)

但还有\(h_i\geq minH\)的限制。因为\(minH\)是递增的,之前满足条件的后来可能不满足。用一个堆维护之前加入的最小的\(h_i\)即可,不满足条件就弹出。

但是\(O(n^2\log n)\)过不去。

问题在于怎么处理\(h_i\geq minH\)。按\(h\)排序然后\(<minH\)的都减掉?显然会多减掉一些不满足另外两个条件而未被统计的。

再观察一下限制,把\(h,v\)分开:\(A(h-minH)\leq C+B(minV-v)\)

显然左式满足\(\geq0\),那么也有\(0\leq C+B(minV-v)\to minV\leq v\leq \frac CB+minV\)
好像就是\(v\)不能过大使得\(h\)过小?

\(v\leq\frac CB+minV\)时,限制一就成了\(A(h-minH)+(\leq C的值)\leq C\)。若\(h\leq minH\),显然满足这个\(s\)的限制。

如果在\(s\)满足条件且\(minV\leq v\leq \frac CB+minV\)\(ans\)++,限制一二仍旧满足。

如果\(h<minH\)\(minV\leq v\leq \frac CB+minV\),如上所说此时也满足\(s\)的限制,所以此时\(ans\)--减掉的就一定是之前统计过的了。所以就可以做到不重不漏了orz。

//976kb 2392ms#include 
#include
#include
#define gc() getchar()typedef long long LL;const int N=5005;struct Node{ int h,v; LL s;}a[N],b[N];inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now;}inline bool cmps(const Node &a,const Node &b){ return a.s
=mnv && a[r].v<=mxv), ++r; while(b[l].h
=mnv && b[l].v<=mxv), ++l; ans=std::max(ans,cnt); } } printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/SovietPower/p/10059017.html

你可能感兴趣的文章
[LeetCode] Candy
查看>>
Jmeter学习系列----3 配置元件之计数器
查看>>
jQuery 自定义函数
查看>>
jq 杂
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
作业一
查看>>
AJAX
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
Git的使用--打tag
查看>>
F# 编程 借助 F# 构建 MVVM 应用程序
查看>>
ACFUN切换代码自用。。。
查看>>
网卡流量检测.py
查看>>
【转】Android的权限permission
查看>>
ajax
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
线程同步机制初识 【转载】
查看>>
Oracle 游标使用全解
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>