优化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 于是悄悄咪咪翻开题解了. 实际上两个数组可以看做一个数组 如 ...
随机推荐
- ul、li模仿ios的TableView实现城市选择
最近项目一个接着一个,之前说的精创环的项目还没做完,今天说先把那个放一下,先做访客系统,销售会见客户之后可以对客户进行一个跟踪记录,原型图也给了,今日头条的频道自定义页面一样. 如果是在IOS上让我来 ...
- JAVA GC 简单总结
GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Gener ...
- PHP 实现页面静态化
PHP文件执行阶段:语法分析->编译->运行 静态html文件执行顺序:运行 动态程序: 连接数据库服务器或者缓存服务器->获取数据->填充到模板->呈现给用户 关于优化 ...
- 系统升级日记(3)- 升级SharePoint解决方案和Infopath
最近一段时间在公司忙于将各类系统进行升级,其最主要的目标有两个,一个是将TFS2010升级到TFS2013,另外一个是将SharePoint 2010升级到SharePoint 2013.本记录旨在记 ...
- 史密斯(smith)圆图讲解
不管多么经典的射频教程,为什么都做成黑白的呢?让想理解史密斯原图的同学一脸懵逼. 这是什么东东? 今天解答三个问题: 1.是什么? 2.为什么? 3.干什么? 1.是什么? 该图表是由菲利普·史密斯( ...
- learning to rank
Learning to Rank入门小结 + 漫谈 Learning to Rank入门小结 Table of Contents 1 前言 2 LTR流程 3 训练数据的获取4 特征抽取 3.1 人工 ...
- Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)
二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...
- Django-Json 数据返回
1 .引入Json import json json.dumps(数据)
- NPOI导入,导出
概述 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.NPOI 可以在没有安装 Office 或者相应环境的机器上对 WO ...
- SPAN的高度问题
FIRST OF ALL,最容易令人忽略而导致头疼的因素.web页面文档类型: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...