题目

有一个坐标范围为(0..T,0..T)(0..T,0..T)(0..T,0..T)的网格图,
给你nnn个整点,你要在其中尽量多的点(左下角和右上角必须选),使得它们互为二维偏序。
在这个基础上,最小化相邻的二维偏序点之间一个左下角一个右上角形成的矩形的面积和。
n≤2e5n\leq 2e5n≤2e5
T≤1e6T\leq 1e6T≤1e6
保证横坐标、纵坐标互不相同。


思考历程

有个小插曲:我很久之后才发现要先保证点的数量尽量多。
将每个点以横坐标为第一关键字,以纵坐标为第二关键字,排序。
“尽量多”显然就是找最长上升子序列。
设fif_ifi​表示以第iii个点结尾的最长上升子序列长度,随便预处理出来。
设gig_igi​表示以第iii个结尾的最小答案。
转移的时候,为了保证选的点集是个最长上升子序列,在转移的条件中多加一条限制:gjg_jgj​转移到gig_igi​时,必须要满足fj+1=fif_j+1=f_ifj​+1=fi​(当然之前二维偏序的限制也要保证)
于是简单的O(n2)O(n^2)O(n2)做法就出炉了。

接下来还有些想法,但是有些漏洞,就不讲了。


正解

考虑将fi=kf_i=kfi​=k的点丢到集合SkS_kSk​。将SkS_kSk​中的点按照xxx坐标排序。
可以发现,SkS_kSk​中的点一定是随着xxx递增,yyy递减的(即全是逆序对)。
证明:如果出现了二维偏序,于是右上方的那个点可以被更新。

对于点iii而言,Sfi−1S_{f_i-1}Sfi​−1​中能够转移到它的点形成一个区间。

转移时新增的贡献为(xi−xj)(yi−yj)(x_i-x_j)(y_i-y_j)(xi​−xj​)(yi​−yj​),拆开,除去只跟iii或者只跟jjj有关的项,于是变成了找wj−xiyj−xjyiw_j-x_iy_j-x_jy_iwj​−xi​yj​−xj​yi​最小,其中wjw_jwj​是只跟jjj有关的值。
接下来可以证明一个性质:
对于SkS_kSk​中的某个点iii和jjj,满足i<ji<ji<j,若有p,q∈Sk−1p,q\in S_{k-1}p,q∈Sk−1​且p<qp<qp<q且p,qp,qp,q都能转移到i,ji,ji,j,
如果对于iii而言,ppp比qqq优,则对于jjj而言,ppp仍然比qqq优。
证明:
对于iii而言ppp比qqq优,即wp−xiyp−yixp<wq−xiyq−yixqw_p-x_iy_p-y_ix_p<w_q-x_iy_q-y_ix_qwp​−xi​yp​−yi​xp​<wq​−xi​yq​−yi​xq​
即(wp−wq)−xi(yp−yq)−yi(xp−xq)<0(w_p-w_q)-x_i(y_p-y_q)-y_i(x_p-x_q)<0(wp​−wq​)−xi​(yp​−yq​)−yi​(xp​−xq​)<0
由yp−yq>0,xp−xq<0y_p-y_q>0,x_p-x_q<0yp​−yq​>0,xp​−xq​<0得:
当iii增大到jjj时,xix_ixi​增加,yiy_iyi​减少,不等式左边的后面两项都减少,于是ppp仍然比qqq优。
根据决策单调性转移:
先考虑一个特殊情况,假设Sk−1S_{k-1}Sk−1​中每个点都可以转移到SkS_kSk​中每个点。
维护一个队列,前面的比后面的大,并且前面的比后面的优。在指针从后往前扫的时候,维护队列中两两之间优劣关系的变化,如果一个元素比下一个元素劣,就把它删掉。

我的做法是这样:对于队列中相邻两个元素,在它们拼接上来的那一刻通过二分计算它们优劣关系改变的时间;然后将这些时间都丢进一个堆(或set)里面,指针移动的时候维护。
古爷说:队列中间的大小关系不会改变。这是一个1d1d的板子,它和斜率优化的区别是不能直接算出优劣关系改变的时间,所以需要二分。
我:中间的关系不会变的话,那直接扫过去,只判断队头啊。
古爷:你试试(
我:。。。
总之古爷太强了,比不过比不过。

但是有个问题是对于每个iii,能转移到它的点集不一定相同。
就是说可能在算jjj的时候,之前对于iii来说,最优的ppp不能转移到jjj。

古爷的做法:直接暴力线段树分治……
将每个ppp能覆盖的iii的区间挂在线段树上,这样在线段树上每个节点的区间上,每个连向它的ppp都能转移到整个区间。

题解的做法很巧妙:
将SkS_kSk​分成若干块,满足对于每个p∈Sk−1p\in S_{k-1}p∈Sk−1​,它必定跟其中两个块相交(其实题解的说法似乎不是很准确,应该说,每个ppp覆盖的区间中有且仅有一个分界点,包括边界)
于是对于某个块来说,ppp覆盖的区间是一段前缀或者是一段后缀。前缀和后缀分开处理,对于每个块,连向它的ppp所能覆盖的区间的起点相同。用个单调队列扫一遍就可以算出答案。

当然我并没有完全看懂题解。因为它还有个二分找区间什么鬼的,不知道在讲啥。
考虑如何分块:将所有ppp能转移到的区间列出来,可以发现随着ppp递增,区间的左右端点都在递增。
将第一个区间的右端点作为分界点,然后将包含这个分界点的区间去掉,继续做下去。
这个贪心感觉是对的。
于是总的时间复杂度O(nlg⁡n)O(n\lg n)O(nlgn)

代码没写。


总结

决策单调性,这个东西好像好久没有玩过了。
该好好补一下。
话说我还记得四边形不等式么……

6319. 【省选组】【USACO 2019 February Platinum】Problem 3. Mowing Mischief相关推荐

  1. 无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]

    继上一节内容,我们在表单里加了个一个单选组,一个复选组: 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti ...

  2. 正版微软Office应该如何选?Office 2019与Office 365区别在哪里?

    去年9月末,微软发布了Office 2019的正式版,很多读者可能会有这样的疑惑,Office既有零售版本,又有365版本,其中,零售版本分家庭和学生版.小型企业版和专业版,Office 365又分家 ...

  3. USACO 2020 February Contest, Gold

    USACO 2020 February Contest, Gold 图片懒得上传了,如果影响阅读可以看个人公开笔记 另外就是之前接近一年没登陆,所以消息都没看到,抱歉了. 测试地址 Problem 1 ...

  4. Lab08-数组初步(2019.11.19)

    Lab08-数组初步(2019.11.19) 文章目录 Lab08-数组初步(2019.11.19) 1. 向数组插入新元素[简单] 2. <Beginning C>5.1[简单] 3. ...

  5. 5、Web 窗体的基本控件——复选框控件和复选组控件(CheckBox 和 CheckBoxList)

    5.Web 窗体的基本控件--复选框控件和复选组控件(CheckBox 和 CheckBoxList) 复选框控件和复选组控件(CheckBox 和 CheckBoxList) 前端 <%@ P ...

  6. 【纪中集训】2019.08.13【省选组】模拟3

    T1 Description 给出一个\(N*N(N≤600)\)的非负矩阵\(B=(b_{ij})\),和一个\(1*N\)的非负矩阵\(C=(c_{ij})\).\(A=(a_{ij})\)是一个 ...

  7. 【纪中集训】2019.08.10【省选组】模拟TJ

    前言 一套码农题-- T1 Description 给定一棵\(n(\in[2,10^5])\)个点的树,\(m(≤10^5)\)次询问,每次询问有两个不相同的点,要让所有点走到这两个点之一(走一条边 ...

  8. 第十届蓝桥杯c语言b组试题,2019年第十届蓝桥杯(决赛)国赛B组C++(B)

    题目: 2019可以被分解成若干个两两不同的素数,请问不同的分解方案有多少种? 注意:分解方案不考虑顺序,如2+2017=2019和2017+2=2019属于同一种方案. 思路先求出2019内的所有素 ...

  9. 蓝桥杯第十届真题B组(2019年)

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组# 试题 A:组队# 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每 ...

  10. USACO 2019/P5203 [USACO19JAN] Exercise Route

    前提:"不行,你这图不能这么存,要用struct","ddy,你是恶魔吧,我就用数组存"--真香! 正文 洛谷 or USACO 首先,分析题意,原本的标准路径 ...

最新文章

  1. SLAM学习,小白入门到殿堂级大牛资料整理
  2. 2019计算机科学论文研讨大会,2019年中华口腔医学会口腔医学计算机专业委员会第十七次全国口腔医学数字化学术会议第一轮会议通知...
  3. [翻译]一步步教你配置SQL SERVER合并复制(五)配置Publisher(上)
  4. javaScript第五天(2)
  5. 谷歌发布最新版安卓Android,谷歌正式除名华为,安卓12华为首发无望,但鸿蒙将迎难顶上!...
  6. Vue与Element入门使用
  7. 大数据认证为什么学python_大数据为什么需要学python?
  8. Android系统 (190)---Android:JSON 简介 amp; 解析方式 讲解(Gson、AS自带org.json、Jackson)
  9. Linux系统内存管理实验报告,Linux 内存管理 综合实验报告.pdf
  10. JAVA System.getProperty()参数
  11. typroa设置字体的颜色
  12. 用NSSM把influxDB安装成windows后台服务
  13. Android WebView白屏解决方案
  14. 思科交换机链路聚合详解收集
  15. 微软推出 Go 语言免费中文教程,真香!
  16. SphereEx 创始人张亮荣获『2021 年度海纳奖——分布式数据库十佳实践人物』
  17. MATLAB报错“现在无法访问以前可以访问的文件”
  18. Len()、Lenw()与Lenb()函数间的区别
  19. linux查看web密码,fuel7.0 openstack webui 默认密码查看
  20. m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法

热门文章

  1. VR全景图之图片拼接教程
  2. html修改progress背景色,html5progress标签如何更改进度条颜色?progress进度条详解
  3. 什么是功率因数补偿/校正
  4. 获取鼠标图片和鼠标位置的方法
  5. css灯箱放大图片,wordpress插件wordpress文章图片放大灯箱效果插件auto-highslide优化版...
  6. 一款经典的 jQuery Lightbox 灯箱效果
  7. 科学计算机调成了fx,科学计算器怎么编程
  8. python-sklearn数据分析-线性回归和支持向量机(SVM)回归预测(实战)
  9. 玩真的了!深度解读拒不履行信息网络安全管理义务将入罪
  10. 偏振光工业相机_工业相机选择六大参数必看