学习了一下凸优化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++;}elseb[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;elsereturn 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]);elsegmax(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 _rl=0;r=(ll)m*m;ans=0;while(l<=r){mid=(l+r)>>1;if(get(mid)>=k){ans=mid;l=mid+1;}elser=mid-1;}return inter(ans+1,ans,k);#undef r
}

新的一年里要继续努力啊...

转载于:https://www.cnblogs.com/jefflyy/p/10218636.html

[UOJ240]aliens相关推荐

  1. uoj240 【IOI2016】aliens

    http://www.elijahqi.win/archives/3761 题目:http://uoj.ac/problem/240 首先将所有点根据对角线 对称 然后 把明显可以被其他覆盖的点去掉 ...

  2. HDU4080 Stammering Aliens(二分 + 后缀数组)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  3. UVA10570 Meeting with Aliens【数学计算】

    The aliens are in an important meeting just before landing on the earth. All the aliens sit around a ...

  4. Stammering Aliens

    2.Stammering Aliens (aliens.cpp) 有一个口吃的外星人,说的话里包含很多重复的字符串,比如babab包含两个bab.给定这个外星人说的一句话,找出至少出现m次的最长字符串 ...

  5. Java实现监督学习在Aliens游戏中的探究尝试

    资源下载地址:https://download.csdn.net/download/sheziqiong/85656972 资源下载地址:https://download.csdn.net/downl ...

  6. 【人工智能】作业3: Aliens游戏 实验报告

    作业3: Aliens游戏 实验报告 吴政亿 151220129 wuzy.nju@gmail.com (南京大学 计算机科学与技术系, 南京 210093) 摘要:使用监督学习来模仿人玩游戏的动作, ...

  7. Pyinstaller打包pygame包的aliens.py文件

    目录 1.安装pyinstaller 2.下载并安装pygame 3.找到安装路径下的例子aliens.py文件 4.将其用pyinstaller对aliens.py进行打包,使其可以成功运行游戏在无 ...

  8. ICPC Latin American Regional Contests 2019 K.Know your Aliens菜鸡版

    参考的原文链接 题目 Our world has been invaded by shape shifting aliens that kidnap people and steal their id ...

  9. LA 4513 Stammering Aliens

    在这道题上学会了两种方法解决.一种是用哈希lcp法,另一种用后缀数组求解. Dr. Ellie Arroway has established contact with an extraterrest ...

最新文章

  1. 在软件中常用的“撤销”操作,其本质是“栈”!
  2. 史上讲的最好的Java NIO与IO的区别与应用
  3. 重装系统后不重装matlab的解决办法
  4. IDEA阿里巴巴Java开发规约插件使用
  5. 图合成与差分隐私(图结构和节点属性)论文笔记
  6. Wave Arts Tube Saturator for Mac(电子管模拟效果器插件)
  7. python 玩彩票程序 随机产生两位数与用户输入的相比较
  8. coreseek添加新词库
  9. 【Mac】Mac 键盘快捷键大全
  10. 在线定时任务表达式生成连接
  11. SCT2612STER,4.2V-60V Vin,1A,高效、频率可调、降压DCDC转换器,LMR16010PDDAR 参数
  12. 微pe工具箱 系统安装教程_微pe工具箱怎么装系统
  13. excel自动排班表_Excel通用值班表日历版,排班人员自动显示,万年历套用
  14. mysql 断开的管道_java.net.SocketException: 断开的管道 (Write failed) 错误,数据库隔一段时间就断开的问题...
  15. wps插入公式与文字不平行问题解决办法
  16. 自然语言处理相关:英文词性缩写一览表
  17. Unity5.0 烘焙物体导入其他场景
  18. linux下要熟练掌握的常用快捷键和命令
  19. 有趣的自定义view —《聆雨》· 上下滑动面板
  20. Java 输出1-100之内的所有质数

热门文章

  1. 乔布斯走后的日子:苹果盛世暗藏危机
  2. Java可变长参数列表
  3. LPDDR4x 的 学习总结(1) - 存储体的浅识
  4. 学数据结构与算法推荐的书
  5. 来自灵魂深处的拷问:人为什么要活着?
  6. 立Flag 学习Ng - 高可用配置
  7. 华硕天选 关闭CPU睿频降低待机温度
  8. 千万不要说联通的网络不好……
  9. mysql 递归查询所有子节点(子部门)返回id集合
  10. MapReduce优化----Shuffle过程剖析及性能优化