/*
首先考虑点在直线的两边效果一样 于是转移到一边
之后发现当我们覆盖某些点时,有其他的一些点一定会被覆盖 我们找出所有必须覆盖的点
之后我们发现我们找到的这些点 将其按照x递增排序 那么y也是递增的
然后我们 可以得到转移方程了 令dp[i][j]表示前i个都覆盖到了,用了j个正方形的最小花费 然后我们考虑转移时的枚举dp[i][j] = min(dp[i][k] + (x[i] - y[k + 1] + 1) ^ 2; 这个是显然NKN的, 斜率优化后NK, wqs二分后Nlogm */ //#include "aliens.h"
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
#define M 100010
#define ll long long
#define inf 0x3f3f3f3f
struct Note{
ll x, y;
bool operator < (const Note &b) const{
return this->x == b.x ? this->y > b.y : this->x < b.x;
}
}note[M], p[M];
int tot,q[M],h,t, sm[M];
ll dp[M], ans; double X(int x) {return p[x + ].y;}
double Y(int x) {return dp[x] - * p[x + ].y + p[x + ].y * p[x + ].y;}
double slope(int x, int y) {return (Y(x) - Y(y)) / (X(x) - X(y));} int solve(ll x)
{
h = , t = , q[] = ;
for(int i = ; i <= tot; i++)
{
while(h < t && 2.0 * p[i].x > slope(q[h], q[h + ])) h++;
dp[i] = dp[q[h]] + (p[i].x - p[q[h] + ].y + ) * (p[i].x - p[q[h] + ].y + ) + x;
sm[i] = sm[q[h]] + ;
if(i == tot) break;
if(p[i + ].y <= p[i].x) dp[i] -= (p[i].x - p[i + ].y + ) * (p[i].x - p[i + ].y + );
while(h < t && slope(q[t], q[t - ]) > slope(q[t], i)) t--;
q[++t] = i;
}
return sm[tot];
} long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) {
for(int i = ; i < n; i++)
{
note[i].y = r[i], note[i].x = c[i];
if(note[i].x < note[i].y) swap(note[i].x, note[i].y);
}
sort(note, note + n);
for(int i = ; i < n; i++)
{
while(h <= t && note[i].y <= note[q[t]].y ) t--;
q[++t] = i;
}
for(int i = h; i <= t; i++){tot++;p[tot].x = note[q[i]].x, p[tot].y = note[q[i]].y;}
if((ans = solve()) <= k) {
return dp[tot];
}
ll L = , R = 1ll * m * m + ;
while(L <= R)
{
ll mid = (L + R) >> ;
if(solve(mid) <= k) R = mid - , ans = dp[tot];
else L = mid + ;
}
// if(ans - 1ll * R * k - k == 568367396612){solve(107455936237); return sm[tot];}
return ans - 1ll * R * k - k;
}
/*
5 7 2
0 4 4 4 4
3 4 6 5 6 2 6 2
1 4
4 1 4 4 4
1 0 2 2
3 1 1 2 1 3
0 1
2 1
2 2
*/

ioi2016aliens的更多相关文章

随机推荐

  1. ARM 平台下的 SSHD 配置

    sshd_config 文件中 允许 root 用户登录 PermitRootLogin yes 配置为内部的 sftp Subsystem sftp internal-sftp key 配置 ssh ...

  2. 状压dp2

    2018年全国多校算法寒假训练营练习比赛(第二场) https://www.nowcoder.com/acm/contest/74/F 上一篇状压dp例题由于每个位置都含有一个非负数,所以不需要判断能 ...

  3. HDU3584 Cube

    分析 三维树状数组,跟二维的差不多,只不过容斥的不一样. 更新区间\((x_1,y_1,z_1)\rightarrow(x_2,y_2,z_2)\)时,需要利用容斥原理.须要更新的节点更新如下: \[ ...

  4. ssh 免 密码登录另一台机器 和 secureCRT的乱码问题

    PS: 就是你把密钥生成好以后,放入B机器中,再登录的时候就已经有了所以就不用验证了 ========================================================= ...

  5. .gitignore忽略git版本库中的文件(夹)

    # 忽略*.o和*.a文件 *.[oa] # 忽略*.b和*.B文件,my.b除外 *.[bB] !my.b # 忽略dbg文件和dbg目录 dbg # 只忽略dbg目录,不忽略dbg文件 dbg/ ...

  6. leetcode:Longest Common Prefix【Python版】

    1.当strs为空,直接输出“” 2.当strs中含有“”,直接输出“” 3.strs[0]的最长长度由最短公共长度l决定(code line:15) class Solution: # @retur ...

  7. StreamSets 相关文章

    相关streamsets 文章(不按顺序) 学习视频-百度网盘 StreamSets 设计Edge pipeline StreamSets Data Collector Edge 说明 streams ...

  8. 《Entity Framework 6 Recipes》中文翻译 ---- 系列教程

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  9. tomcat源码阅读之生命周期(LifeCycle)

    一.事件机制流程: 1.     当外部事件源发生事件(比如点击了按钮,数据发生改变更新等)时,事件源将事件封装成事件对象Event: 2.     将事件对象交由对应的事件派发器Dispatcher ...

  10. 如何生成SPFILE文件

    1.spfile是Oracle9i之后引入的,目的是提高系统安全性.在Oracle8i下初始化参数文件为文本文件,可以使用文本编辑器进行编辑,当需要修改初始化参数时,需要在init.ora文件中修改, ...