优化DP的奇淫技巧
DP是搞OI不可不学的算法。一些丧心病狂的出题人不满足于裸的DP,一定要加上优化才能A掉。
//OJ 1326
//by Cydiater
//2016.8.8
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iomanip>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll N,M,f[MAXN],q[MAXN],head=,tail=,sum[MAXN];
namespace solution{
void init(){
N=read();M=read();
memset(sum,,sizeof(sum));
up(i,,N)sum[i]=read()+sum[i-];
}
void dp(){
memset(f,,sizeof(f));
f[]=M;q[++tail]=;
up(i,,N){
*i)head++;
int id=q[head];
f[i]=f[id]+sum[i]-sum[id]-i*;
while(head<=tail&&f[i]-f[q[tail]]>=sum[i]-sum[q[tail]])tail--;
q[++tail]=i;
}
}
void output(){
printf("%I64d\n",f[N]);
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}
//OJ 1327
//by Cydiater
//2016.8.8
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdlib>
#include <iomanip>
#include <ctime>
#include <cmath>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline int read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
][MAXN],head[],tail[],f[][MAXN];
namespace solution{
void init(){
memset(f,,sizeof(f));
N=read();M=read();S=read();
up(i,,N)u[i]=read();
up(i,,N)d[i]=read();
}
void dp(){
f[][]=;
up(i,,)head[i]=,tail[i]=;
q[][++tail[]]=;
up(i,,N)down(j,S,){
]<tail[i-]&&q[i-][head[i-]]>u[i]+j)head[i-]++;
f[i][j]=f[i-][q[i-][head[i-]]]+(M-d[i])*q[i-][head[i-]]+(u[i]+j)*d[i];
])*q[i][tail[i]]>=f[i][j]+(M-d[i+])*j&&head[i]<=tail[i])tail[i]--;
q[i][++tail[i]]=j;
}
}
void output(){
printf(]);
}
}
int main(){
freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}
f[i]=min{f[j]+(T[i]-T[j]+S)*F[i]} i<j<=N
f[i]=min{f[j]-T[j]*F[i]}+(T[i]+S)*F[i] i<j<=N
f[x]-T[x]*F[i]<=f[y]-T[y]*F[i]f[x]-f[y]<=T[x]*F[i]-T[y]*F[i](f[x]-[y])/(T[x]-T[y])<=F[i]
//OJ 1328
//by Cydiater
//2016.8.9
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <cmath>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline int read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
int N,S,F[MAXN],T[MAXN],a[MAXN],b[MAXN],f[MAXN],q[MAXN],head,tail;
namespace solution{
void init(){
N=read();S=read();
up(i,,N){
a[i]=read();b[i]=read();
}
F[N+]=T[N+]=;
down(i,N,){
T[i]=T[i+]+a[i];
F[i]=F[i+]+b[i];
}
}
inline double K(int x,int y){return 1.0*(f[x]-f[y])/(1.0*(T[x]-T[y]));}
void dp(){
head=;tail=;q[++tail]=;
down(i,N,){
],q[head])<F[i])head++;
f[i]=f[q[head]]-T[q[head]]*F[i]+(T[i]+S)*F[i];
]))tail--;
q[++tail]=i;
}
}
void output(){
cout<<f[]<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}
//OJ 1329
//by Cydiater
//2016.8.9
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <string>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define FILE "bzoj_1010"
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll N,L,a[MAXN],f[MAXN],q[MAXN],head=,tail=;
namespace solution{
inline double Q(int x){return a[x]+1.0*x;}
inline ;}
inline double col(int x,int y){
double tmp2=f[y]+Q(y)*Q(y);
double tmp1=f[x]+Q(x)*Q(x);
return (tmp2-tmp1)/(Q(y)-Q(x));
}
void init(){
N=read();L=read();
memset(a,,sizeof(a));
up(i,,N)a[i]=read()+a[i-];
}
void dp(){
q[++tail]=;
up(i,,N){
])<*P(i))head++;
f[i]=f[q[head]]+(P(i)-Q(q[head]))*(P(i)-Q(q[head]));
],q[tail])>col(q[tail],i))tail--;
q[++tail]=i;
}
}
void output(){
cout<<f[N]<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
using namespace solution;
init();
dp();
output();
;
}
//OJ 1330
//by Cydiater
//2016.8.9
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <map>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <iomanip>
#include <cstring>
#include <string>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
typedef pair<ll,ll> pll;
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll N,cnt=,q[MAXN],head=,tail=,f[MAXN];
pll t[MAXN],a[MAXN];
namespace solution{
inline bool cmp(pll x,pll y){return x.first==y.first?x.second>y.second:x.first>y.first;}
inline double col(int x,int y){
].first-a[y+].first));
}
void init(){
N=read();
up(i,,N){
t[i].first=read();
t[i].second=read();
}
sort(t+,t+N+,cmp);
ll last=;
t[].first=;t[].second=;
up(i,,N){
if(t[i].first<=t[last].first&&t[i].second<=t[last].second)continue;
else{
a[++cnt]=t[i];
last=i;
}
}
N=cnt;
}
void dp(){
q[++tail]=;
up(i,,N){
])<=a[i].second)head++;
f[i]=f[q[head]]+a[q[head]+].first*a[i].second;
],q[tail]))tail--;
q[++tail]=i;
}
}
void output(){
cout<<f[N]<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}
//OJ 1661
//by Cydiater
//2016.8.10
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <map>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <cstring>
#include <string>
#include <iomanip>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll N,A,B,C,sum[MAXN],q[MAXN],head,tail,f[MAXN];
namespace solution{
inline double F(int x){return f[x]+A*sum[x]*sum[x]-B*sum[x];}
inline double sqr(ll x){return x*x;}
void init(){
memset(sum,,sizeof(sum));
memset(f,,sizeof(f));
N=read();A=read();B=read();C=read();
up(i,,N)sum[i]=read()+sum[i-];
}
void dp(){
head=;tail=;q[++tail]=;
up(i,,N){
])-F(q[head])>sum[i]**A*(sum[q[head+]]-sum[q[head]]))head++;
f[i]=f[q[head]]+A*(sum[i]-sum[q[head]])*(sum[i]-sum[q[head]])+B*(sum[i]-sum[q[head]])+C;
]])>(F(q[tail])-F(q[tail-]))*(sum[i]-sum[q[tail]]))tail--;
q[++tail]=i;
}
}
void output(){
cout<<f[N]<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}

//OJ 1662
//by Cydiater
//2016.8.11
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <iomanip>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll f[MAXN],p[MAXN],s[MAXN],cost[MAXN],N,q[MAXN],head,tail,sum1[MAXN],sum2[MAXN];
namespace solution{
inline double col(int y,int x){
double tmp1=f[x]-f[y]+sum1[x]-sum1[y];
double tmp2=sum2[x]-sum2[y];
return tmp1/tmp2;
}
void init(){
N=read();
up(i,,N){
s[i]=read();
p[i]=read();
cost[i]=read();
sum1[i]=sum1[i-]+p[i]*s[i];
sum2[i]=sum2[i-]+p[i];
}
}
void dp(){
head=;tail=;q[++tail]=;
up(i,,N){
])<s[i])head++;
f[i]=cost[i]+s[i]*(sum2[i]-sum2[q[head]])-(sum1[i]-sum1[q[head]])+f[q[head]];
],q[tail])>col(q[tail],i))tail--;
q[++tail]=i;
}
}
void output(){
cout<<f[N]<<endl;
}
}
int main(){
freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}

//BZOJ 3156
//by Cydiater
//2016.8.11
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <cstdio>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll N,f[MAXN],q[MAXN],head,tail,a[MAXN];
namespace solution{
inline double col(ll x,ll y){
*(f[y]-f[x])+(x+y+)*(y-x);
*(y-x);
return tmp1/tmp2;
}
void init(){
N=read();
up(i,,N)a[i]=read();
}
void dp(){
head=;tail=;q[++tail]=;
up(i,,N){
])<i)head++;
f[i]=f[q[head]]+(i-q[head])*(i-q[head]-)/+a[i];
],q[tail]))tail--;
q[++tail]=i;
}
}
void output(){
printf("%lld\n",f[N]);
}
}
int main(){
//freopen("input.in","r",stdin);
//freopen("out2.out","w",stdout);
using namespace solution;
init();
dp();
output();
;
}
//BZOJ 3675
//by Cydiater
//2016.8.11
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <iomanip>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
;
const int oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
ll N,K,sum[MAXN],f[MAXN][],q[MAXN][],head[],tail[];
namespace solution{
inline ll col(int i,int k){return sum[k]*sum[k]-f[k][i];}
inline bool judge(int x,int y,int z,int k){
return (col(k,y)-col(k,x))*(sum[z]-sum[y])>=(col(k,z)-col(k,y))*(sum[y]-sum[x]);
}
void init(){
N=read();K=read();K++;
up(i,,N)sum[i]=read()+sum[i-];
}
void dp(){
memset(f,,sizeof(f));
head[]=;tail[]=;q[++tail[]][]=;
up(j,,K){
;
head[k%]=;tail[k%]=;
up(i,,N){
]<tail[k^]&&col(k^,q[head[k^]+][k^])-col(k^,q[head[k^]][k^])<sum[i]*(sum[q[head[k^]+][k^]]-sum[q[head[k^]][k^]]))head[k^]++;
f[i][k%]=f[q[head[k^]][k^]][k^]+sum[q[head[k^]][k^]]*(sum[i]-sum[q[head[k^]][k^]]);
]<tail[k%]&&judge(q[tail[k%]-][k%],q[tail[k%]][k%],i,k%))tail[k%]--;
q[++tail[k%]][k%]=i;
}
}
/*up(i,1,K)up(j,1,N)
printf("i==%d k==%d f[i][k]==%d\n",i,j,f[j][i]);*/
}
void output(){
cout<<f[N][K%]<<endl;
}
}
int main(){
//freopen("input.in","r",stdin);
using namespace solution;
init();
dp();
output();
;
}
今天在做一些奇奇怪怪的东西的时候又遇到了斜率优化,这时候get到一个新的点,斜率优化右边关于i的多项式应该是递增的
优化DP的奇淫技巧的更多相关文章
- Gradle更小、更快构建APP的奇淫技巧
本文已获得原作者授权同意,翻译以及转载原文链接:Build your Android app Faster and Smaller than ever作者:Jirawatee译文链接:Gradle更小 ...
- # ACM奇淫技巧
目录 ACM奇淫技巧 差分操作 坐标旋转 ACM 卡常优化 vsc代码块(头文件模板) 读入输出优化 逗号表达式 内联函数inline 寄存器变量register 条件判断加减代替取模 自增运算符优化 ...
- 12个实用的 Javascript 奇淫技巧
这里分享12个实用的 Javascript 奇淫技巧.JavaScript自1995年诞生以来已过去了16个年头,如今全世界无数的网页在依靠她完成各种关键任务,JavaScript曾在Tiobe发布的 ...
- NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC)
NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC) ARGUS 1月13日 发布 推荐 0 推荐 收藏 2 收藏,1.1k 浏览 文章整理中...... 实现思路 当服务器接收 ...
- NGINX的奇淫技巧 —— 3. 不同域名输出不同伺服器标识
NGINX的奇淫技巧 —— 3. 不同域名输出不同伺服器标识 ARGUS 1月13日 发布 推荐 0 推荐 收藏 6 收藏,707 浏览 大家或许会有这种奇葩的需求...要是同一台主机上, 需要针对不 ...
- NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1)
NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1) ARGUS 1月13日 发布 推荐 0 推荐 收藏 3 收藏,839 浏览 nginx的if支持=.!= 逻辑比较, 但不支持if中 & ...
- Zepto源码分析(二)奇淫技巧总结
Zepto源码分析(一)核心代码分析 Zepto源码分析(二)奇淫技巧总结 目录 * 前言 * 短路操作符 * 参数重载(参数个数重载) * 参数重载(参数类型重载) * CSS操作 * 获取属性值的 ...
- javascript之奇淫技巧
最近准备面试,复习一下javascript,整理了一些javascript的奇淫技巧~ //为兼容ie的模拟Object.keys() Object.showkeys = function(obj) ...
- BZOJ 3192: [JLOI2013]删除物品 奇淫技巧&树状数组
点我看题 这题十分奇淫技巧...QAQ因为知道是树状数组的题QAQ刚开始以为维护两个数组的树状数组然后模拟从大到小,然后发现不会打QAQ 于是悄悄咪咪翻开题解了. 实际上两个数组可以看做一个数组 如 ...
随机推荐
- 浅析手机抓包方法实践(zt)
原文:http://drops.wooyun.org/tips/12467 0x00 摘要 在移动逆向分析以及 App 开发的时候,总会需要对其网络行为进行监控测试,本文总结一些抓包思路,并对其使用方 ...
- FFmpeg 1.2 for Android 生成一个动态库
上一篇<FFmpeg 1.2 for Android 编译动态库>里沃特跟大家介绍了如何编译动态库,但当时所生成的动态库总共包含10个so文件,这样要是加载起来会严重影响软件的启动速度,后 ...
- socket.io简单说明及在线抽奖demo
socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...
- java代码注释规范
java代码注释规范 代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率.也是程序代码可维护性的重要环节之一.所以我们不是为写注释而写注释.下面说一下我们在诉求网二 ...
- js中递归函数的使用介绍
所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示: ...
- 用自己的话描述wcf中的传输安全与消息安全的区别(三)
消息交换安全模式 PS:很多书上把transfer security和transport security都翻译成“传输安全”,这样易混淆.我这里把transfer说成消息交换安全. 安全的含义分为验 ...
- 用centos光盘安装RPM包的方法
1.在虚拟机光盘选项中设置连接路径为centos安装光盘. 2.将光盘挂载到本地目录. #新建一个文件夹 mkdir cdrom #把光盘挂载到cdrom目录下 mount /dev/cdrom cd ...
- mysql的主从复制是如何实现的
前言 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为 ...
- [转]制作png格式透明图片的简易方法
原文地址:http://blog.csdn.net/zhouyingge1104/article/details/24460743 photoshp之类的专业软件太复杂,其实,制作透明图标有比较简易的 ...
- iOS开发中的错误整理,IOS9中canOpenURL调用失败分析
由于IOS加入对用户隐私以及禁止扫描系统信息的控制,目前通过canOpenURL的方法来判断用户是否安装特定app,则会出现-canOpenURL: failed for URL: "ABC ...