学习了一下凸优化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. 编译ONNX模型Compile ONNX Models
  2. 问题-[ACCESS2007]怎么显示MsysObjects
  3. 在linux下实现拓扑排序,数据结构——有向图(拓扑排序算法)
  4. java 两个日期的天数_java计算两个日期之间的天数
  5. maven 引入net.sf.json-lib依赖时报错(classifier)
  6. KAFKA分布式消息系统
  7. FastCGI中文规范
  8. leetcode 剑指 Offer 05. 替换空格
  9. 面向对象(特点)、局部变量与全局变量的区别、匿名对象、构造函数、
  10. 两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?
  11. 写给小白的计算机概论
  12. mysql 高可用架构 proxysql 之一 yum安装
  13. 谈谈网络游戏中的延迟解决方案
  14. jquery学习系列1(Ready)
  15. CentOS7.5中Moodle 3.7之PHP Cli(命令行)方式安装
  16. 实践系列:分销平台的技术架构
  17. 华泰证券:“融券通”是何阳谋?
  18. 付费资源不能上传了?!
  19. java画笑脸_canvas 画笑脸
  20. 歌曲:后来的我们 歌手:品冠

热门文章

  1. 全国税收调查数据 (1)涵盖范围 全国税收调查数据收录了与税务相关的年度数据,时间跨度为2007年至2016年。该数据库具体涵盖增值税、增值税出口退税、消费税、营业税、房产税、城镇土地使用税、
  2. python读取多个txt文件数据恢复_多个文件内容
  3. 低通滤波器算法LPF的python图像化验证
  4. 关于单帧,首帧,流控帧,连续帧
  5. android 创建aar包
  6. (基础很弱的人)如何学好英文
  7. 个人总结:程序员实用网址收藏
  8. 进击吧!Pythonista(6/100)
  9. nginx文件服务器5万并发量,Nginx服务器高性能优化-轻松实现10万并发访问量
  10. 天气预报-微信小程序-源码