[UOJ240]aliens
学习了一下凸优化DP,感觉挺有意思的
首先把所有点对称到左下角,然后以每个点为顶点画等腰直角三角形,将被覆盖的点去掉,现在所有点从左上到右下横纵坐标都是递增的,设坐标为$(x_{1\cdots M},y_{1\cdots M})$
设$f_{j,i}$表示拍$j$次照片覆盖$i$个点的最少覆盖方格数,枚举最后一个矩形覆盖到之前的哪个点,有$f_{j,i}=\min\limits_{0\leq k\lt i}f_{j-1,k}+\left(y_i-x_{k+1}+1\right)^2-\max\left(y_i-x_{i+1}+1,0\right)^2$,最后减去的是和下一个矩形的重复部分
直接斜率优化可以$O(nk)$,还需要再快一些
凸优化用于解决一类“恰好选$k$个”的问题,在这题中,如果把$f_{j,i}$关于$j$的图像画出来,可以看出它的斜率不减(这我不会证,官方题解上也没讲怎么证,但一般可以通过打差分表猜出结论)
对于常数$C$,设$g_i=\min\limits_jf_{j,i}+jC$,将$f$用转移展开后再回代$g$的定义,我们得到$g_i=\min\limits_{0\leq k\lt i}g_k+\left(y_i-x_{k+1}+1\right)^2-\max\left(y_i-x_{i+1}+1,0\right)^2+C$,可以$O(n)$求
$g_i$是将$\Delta f_{j,i}$平移后取$f$的最小值得到的,所以当$C$增大时使$g$取到最小值的$j$会变小,于是我们可以通过二分找到一个$p$使得当$C=p$时,使$g_M$取得最小值的$j_1\geq k$,当$C=p+1$时,使$g_M$取得最小值的$j_2\leq k$
我们已经得到了$f_{j_1,M},f_{j_2,M}$,现在要求$f_{k,M}\left(k\in[j_2,j_1]\right)$,因为再把$\Delta f_{j,i}$往上平移$1$单位就会让最小值位置偏移,所以$\Delta f_{j_2+1\cdots j_1,M}$全部相等,也就是说$f_{j_2\cdots j_1,M}$是一条直线,所以可以直接算出$f_{k,M}$
总的来说,如果$f_{j,i}$是关于$j$的凸函数,难以求值却易求最值,那么可以考虑偏移$\Delta f_{j,i}$来改变最小值的位置,进而求出某个位置的值
总时间复杂度$O(n\log m)$,相当优美
#include<stdio.h> #include<vector> #include<math.h> using namespace std; typedef long long ll; typedef double du; typedef vector<int> vi; const du eps=1e-5; template<class t>void gmax(t&a,t b){ if(a<b)a=b; } ll sqr(ll x){return x*x;} struct line{ ll k,b; int i; line(ll k=0,ll b=0,int i=0):k(k),b(b),i(i){} ll v(ll x){return k*x+b;} }q[100010],u; du its(line a,line b){ return(b.b-a.b)/(du)(a.k-b.k); } int x[100010],y[100010],M; ll g[100010]; int b[100010]; int get(ll c){ int head,tail,i; head=tail=1; q[1]=line((x[1]-1)*-2,sqr(x[1]-1)); for(i=1;i<=M;i++){ while(head<tail&&its(q[head],q[head+1])<y[i]-eps)head++; if(head<tail&&fabs(its(q[head],q[head+1])-y[i])<eps){ b[i]=min(q[head].i,q[head+1].i)+1; head++; }else b[i]=q[head].i+1; g[i]=q[head].v(y[i])+sqr(y[i])+c-sqr(max(y[i]-x[i+1]+1,0)); if(i<M){ u=line((x[i+1]-1)*-2,g[i]+sqr(x[i+1]-1),b[i]); while(head<tail&&its(q[tail],q[tail-1])>its(q[tail],u))tail--; q[++tail]=u; } } return b[M]; } int a[1000010]; ll inter(ll lc,ll rc,ll x){ ll lx,ly,rx,ry; lx=get(lc); ly=g[M]-lc*lx; rx=get(rc); ry=g[M]-rc*rx; if(lx!=rx) return(ly-ry)/(rx-lx)*(rx-x)+ry; else return ly; } ll take_photos(int n,int m,int k,vi r,vi c){ int i,t; ll l,_r,mid,ans; for(i=0;i<n;i++){ r[i]++; c[i]++; if(r[i]<c[i]) gmax(a[r[i]],c[i]); else gmax(a[c[i]],r[i]); } M=0; t=0; for(i=1;i<=m;i++){ if(a[i]>t){ M++; x[M]=i; y[M]=a[i]; t=a[i]; } } x[M+1]=m+1; k=min(k,M); #define r _r l=0; r=(ll)m*m; ans=0; while(l<=r){ mid=(l+r)>>1; if(get(mid)>=k){ ans=mid; l=mid+1; }else r=mid-1; } return inter(ans+1,ans,k); #undef r }
新的一年里要继续努力啊...
[UOJ240]aliens的更多相关文章
- Uva12206 Stammering Aliens 后缀数组&&Hash
Dr. Ellie Arroway has established contact with an extraterrestrial civilization. However, all effort ...
- HDU4080 Stammering Aliens(二分 + 后缀数组)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...
- UVA 12206 - Stammering Aliens(后缀数组)
UVA 12206 - Stammering Aliens 题目链接 题意:给定一个序列,求出出现次数大于m,长度最长的子串的最大下标 思路:后缀数组.搞出height数组后,利用二分去查找就可以 这 ...
- Stammering Aliens
Stammering Aliens Time Limit: 2000MS Memory Limit: 65536K Description Dr. Ellie Arroway has ...
- XCOM2中敌对生物设计分析(Aliens篇)
Aliens Aliens作为游戏设定中入侵的外星人,有各式外貌及奇特的战斗方式,掌握一些高能科技或利用精神力量进行攻击 Sectoid 使用灵能战斗的外星人,并无高级版本,初级便会使用精神控制,生命 ...
- UVA10570-Meeting with Aliens(枚举)
Problem UVA1616-Caravan Robbers Accept: 531 Submit: 2490Time Limit: 3000 mSec Problem Description I ...
- UVA-10570 Meeting with Aliens (枚举+贪心)
题目大意:将一个1~n的环形排列变成升序的,最少需要几次操作?每次操作可以交换任意两个数字. 题目分析:枚举出1的位置.贪心策略:每次操作都保证至少一个数字交换到正确位置上. # include< ...
- HDU4080Stammering Aliens(后缀数组+二分)
However, all efforts to decode their messages have failed so far because, as luck would have it, the ...
- P5896 [IOI2016]aliens
*IX. P5896 [IOI2016]aliens DP 优化方法大杂烩,详解 wqs 二分及其注意事项,斜率优化等其它 DP 优化方法. **** 团队赛 T6,没想到是 IOI 原题.当时看出来 ...
随机推荐
- SDL封装的系统操作(转载)
Andrew Haung bluedrum@163.com SDL封装很多操作系统的功能,为了保证SDL程序可移植性,最好尽量用这一些封装函数,哪果没有的话,才使用各种操作本地函数. 对于如何封各个 ...
- mysql5.7.10 源码编译安装记录 (centos6.4)【转】
一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...
- Web测试技术要领
基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...
- strace使用详解(未研究)
(一) strace 命令 用途:打印 STREAMS 跟踪消息. 语法:strace [ mid sid level ] ... 描述:没有参数的 strace 命令将所有的驱动程序和模块中的 ...
- jenkins主从服务器部署
当服务器为linux系统但也有部分ios代码,此时就需要添加一个从jenkins以便编译ios代码.或者需要多个job同时编译这时就需要搭建主从服务器. 1.主(master)节点安装jenkins ...
- 链家2018春招C/C++开发实习生在线考试编程题
题目一 题解:该题目意思就是让你输入n组数据,然后求并集,利用STL容器set集合的特性:元素不重复存储,我们可以很轻易得出答案 #include <iostream> #include ...
- 洛谷P2458 保安站岗
传送门啦 分析: 树形dp刚刚入门,这是我做的第一个一个点同时受父亲节点和儿子节点控制的题目. 由于这个题中某一个点放不放保安与父亲和儿子都有关系(因为线段的两个端点嘛),所以我们做题时就要考虑全面. ...
- thinkphp辅助方法,数据库操作
- CSS — 贝塞尔曲线(cubic-bezier)
cubic-bezier 又称三次贝塞尔,主要是为 animation 生成速度曲线的函数,规定是 cubic-bezier(<x1>, <y1>, <x2>, & ...
- IntelliJ IDEA 把Json字符串 增加到IDE里 用windows记事本 能自动转换(自动增加转义字符)