USACO 19 FEB Mowing Mischief P 题解
题目传送门
题目大意: 给出 nnn 个平面上的点,你要选定若干个点,满足 xi−1<xi,yi−1<yix_{i-1}<x_i,y_{i-1}<y_ixi−1<xi,yi−1<yi,然后在选出点最多的前提下使相邻的两个点围成的矩形面积之和最小。
题解
由于要使选出点最多,所以先将 xxx 排序然后跑个最长上升子序列,记以 iii 结尾的 lislislis 为 lil_ili,那么要将点按 lil_ili 分组,每组内的点只能从上一组的点转移过来。
由于一组内的点的 lil_ili 相同,所以有一个性质:不存在同组内的两个点满足 xj<xi,yj<yix_j<x_i,y_j<y_ixj<xi,yj<yi,否则 lil_ili 肯定至少比 ljl_jlj 大 111。而由于我们按 xxx 排了序,所以对于同组内 j<ij<ij<i,一定有 xj<xi,yj>yix_j<x_i,y_j>y_ixj<xi,yj>yi。
考虑暴力dp,设 fif_ifi 表示走到 iii 点的最小矩形面积,有:
fi=min{fj+(xi−xj)(yi−yj)}f_i=\min\{f_j+(x_i-x_j)(y_i-y_j)\} fi=min{fj+(xi−xj)(yi−yj)}
若对 iii 来说,从 jjj 转移优于从 kkk 转移,那么有:
fj+xjyj+xiyi−xiyj−xjyi<fk+xkyk+xiyi−xiyk−xkyixi(yj−yk)+yi(xj−xk)>fj+xjyj−fk−xkyk\begin{aligned} f_j+x_jy_j+x_iy_i-x_iy_j-x_jy_i&<f_k+x_ky_k+x_iy_i-x_iy_k-x_ky_i\\ x_i(y_j-y_k)+y_i(x_j-x_k)&>f_j+x_jy_j-f_k-x_ky_k\\ \end{aligned} fj+xjyj+xiyi−xiyj−xjyixi(yj−yk)+yi(xj−xk)<fk+xkyk+xiyi−xiyk−xkyi>fj+xjyj−fk−xkyk
当 j<kj<kj<k 时,根据上面的性质,就有 yj−yk>0,xj−xk<0y_j-y_k>0,x_j-x_k<0yj−yk>0,xj−xk<0,假如将 xi,yix_i,y_ixi,yi 看成变量,那么满足这个式子的 xi,yix_i,y_ixi,yi 就一定在某条斜率为正的直线下方(手玩一下 xix_ixi 增大时 yiy_iyi 的变化就好了)。
当 iii 增大时,又根据性质,xix_ixi 一定增大,yiy_iyi 一定减小,不难发现这个点一定还在那条直线的上方,也就是说,jjj 依然比 kkk 优。
类似的,当 j>kj>kj>k 时,xi,yix_i,y_ixi,yi 就在某条直线的上方,当 iii 减小时,依然存在 jjj 比 kkk 优。
有了单调性,我们就可以分治了。对于一组内的某个点,上一组中能转移到它的一定是一个区间,考虑用线段树分治将这个点的询问放到这个区间上。
然后对于线段树上的每个点,我们就可以愉快的再利用单调性跑分治了,具体可以参考代码。
代码如下:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 200010int n,M;
struct point{int x,y;}a[maxn];
bool cmp(point x,point y){return x.x<y.x;}
template<class TY>inline void chkmax(TY &x,TY y){if(y>x)x=y;}
template<class TY>inline void chkmin(TY &x,TY y){if(y<x)x=y;}
struct TREE{int tr[1000010];void change(int x,int y){for(;x<=M;x+=(x&-x))chkmax(tr[x],y);}int getmax(int x){int re=0;for(;x;x-=(x&-x))chkmax(re,tr[x]);return re;}
}tr;
int lis[maxn];
vector<int> d[maxn],s[maxn<<1];
long long f[maxn];
void insert(int now,int l,int r,int x,int la){if(a[x].x<a[d[la][l]].x||a[x].y<a[d[la][r]].y)return;//整个区间都不能转移到x,就退出if(a[x].x>a[d[la][l]].x&&a[x].y>a[d[la][l]].y//整个区间都能转移到x&&a[x].x>a[d[la][r]].x&&a[x].y>a[d[la][r]].y){s[now].push_back(x);return;}int mid=l+r>>1;insert(now<<1,l,mid,x,la);insert(now<<1|1,mid+1,r,x,la);
}
void solve(int l,int r,int L,int R,int now,int la){if(L>R)return;//分治到询问的[L,R]区间,此时上一组中能转移到这个区间的区间为[l,r]long long mi=1e18;int pos,mid=L+R>>1;//下面是找到mid的最优转移点for(int i=l;i<=r;i++){if(f[d[la][i]]+1ll*(a[s[now][mid]].x-a[d[la][i]].x)*(a[s[now][mid]].y-a[d[la][i]].y)<mi)mi=f[d[la][i]]+1ll*(a[s[now][mid]].x-a[d[la][i]].x)*(a[s[now][mid]].y-a[d[la][i]].y),pos=i;}chkmin(f[s[now][mid]],mi);//由于在pos左边的点都不如pos优,所以当mid减小时这些点依然不如pos优//此时对于[L,mid)这个区间而言,只需要考虑pos右边的点是否能转移即可,(mid,R]类似。solve(l,pos,mid+1,R,now,la);solve(pos,r,L,mid-1,now,la);
}
void go(int now,int l,int r,int la){solve(l,r,0,s[now].size()-1,now,la);s[now].clear();if(l==r)return;int mid=l+r>>1;go(now<<1,l,mid,la);go(now<<1|1,mid+1,r,la);
}int main()
{scanf("%d %d",&n,&M);for(int i=1;i<=n;i++)scanf("%d %d",&a[i].x,&a[i].y);a[n+=2]=(point){M,M};sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){lis[i]=tr.getmax(a[i].y)+1;tr.change(a[i].y+1,lis[i]);d[lis[i]].push_back(i);}memset(f,63,sizeof(f)),f[1]=0;for(int i=2;i<=n;i++){if(!d[i].size())break;for(int j:d[i])insert(1,0,d[i-1].size()-1,j,i-1);go(1,0,d[i-1].size()-1,i-1);}printf("%lld",f[n]);
}
/*
0 10
*/
USACO 19 FEB Mowing Mischief P 题解相关推荐
- USACO翻译:USACO 2014 FEB SILVER 三题
USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- 【今日CV 视觉论文速览】19 Feb 2019
今日CS.CV计算机视觉论文速览 Tue, 19 Feb 2019 Totally 51 papers Interesting: ?单RGB图预测单层.多层深度图和极线虚拟特征图,用于三维场景重建,首 ...
- [USACO 2010 Feb S]Chocolate Eating
题目: [USACO 2010 Feb S]Chocolate Eating ,哈哈,我们今天来看一道二分答案的题嘛,这是选自USACO上的一道题,好了,我们一起来看看题意吧: 题目描述是复制的,可能 ...
- USACO 2020~2021 February Contest GOLD 题解(3)
USACO 2020~2021 二月黄金组 题解(3) 3. Count The Cows As is typical, Farmer John's cows have spread themselv ...
- Luogu P5244 [USACO2019Feb Platinum] Mowing Mischief (动态规划、决策单调性)
题目链接 https://www.luogu.com.cn/problem/P5244 题解 首先求出 LIS. 根据 LIS 的值我们可以对整个点集分层,每一层内进行 DP. 将每层的点按 \(x_ ...
- 【USACO】2017 December Contest, Platinum题解
[比赛经历] 大概顺利满分了,就是T2的代码比较难调. T2能够直观地反映出GDB和输出调试结合的优越性. [T1]Standing Out from the Herd [题目链接] 点击打开链接 [ ...
- 哈尔滨理工大学软件与微电子学院程序设计竞赛(19级新生赛)——题解
注:所有题目不要求多组输入 索引: A. 小乐乐学编程 B. 小乐乐算平均分 C. 小乐乐找最大数 D. 小乐乐是否被叫家长 E. 小乐乐转换成绩 F. 小乐乐算多少人被请家长 G. 小乐乐算最高分 ...
- 写到usaco上的一题可能题解是凸包所以转来这篇文章看看
凸包 graham 算法 标签: 算法distancexpstructoutputinput 2011-09-08 12:30 8371人阅读 评论(2) 收藏 举报 分类: c++ 凸包 grah ...
- [ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)
\(\\\) \(Description\) 给定长度为\(2N\)的序列,\(1\text ~N\)各出现过\(2\)次,\(i\)第一次出现位置记为\(a_i\),第二次记为\(b_i\),求满足 ...
最新文章
- Python正则表达式常用的15个符号整理
- 双向口和准双向口操作的不同!
- 彻底解决windows2003不能共享文件夹或者共享后不能访问的问题
- [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
- 微信小程序02【配置详解、生命周期-app对象使用、页面跳转详解】
- Zookeeper的一致性是什么情况?
- 无穷级数求和7个公式_大家看,用反证法判别级数敛散性(送微积分同学)!...
- java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、
- Linux系统编程26:进程间通信之进程间通信的基本概念
- TIOBE开发语言排行榜
- 无缝世界网游服务器架构的设计思路
- python 设计模式之组合模式Composite Pattern
- 教授先生带你学习链表:双向链表3
- session.setattribute 设置后取不到值_从入门到精通,别处学不到的污泥浓度计的使用和维护技巧...
- 每周进度条(第10周)
- Cisco无线AP在复杂企业环境配置指南
- matlab中迪杰斯特拉算法,dijkstra算法(迪杰斯特拉算法)
- 未能启动apache服务器,教你apache服务无法启动一直失败怎么办
- 福利:go语言开发的sock5代理服务器
- Linux、Windows、Mac非root普通用户使用秘钥免密SSH登录
热门文章
- 小米手机 Toast显示带应用名称问题解决方法
- viser 饼图修改颜色
- matlab 电力电子仿真电路,基于Matlab_Simulink的电力电子电路仿真.pdf
- 石家庄地铁售票系统进度(田智凯,高泽伟)
- 我眼中的嵌入式是这样的!
- 怎么不让WORD自动检查语法和拼写错误,福利在这里,不让WORD自动检查语法和拼写错误该如何设置
- PR1:初识PR界面
- flex:1是什么意思
- Component template should contain exactly one root element. If you are using v-if on multiple eleme
- 松翰单片机数码管c语言,松翰单片机定时中断数码管程序