博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
阅读量:6692 次
发布时间:2019-06-25

本文共 1499 字,大约阅读时间需要 4 分钟。

 

啧……明明以前做到过这种类型的题结果全忘了……

这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值

再枚举列,对行做一遍单调队列,用之前搞出来的最小权值再做一次单调队列,更新答案

感觉很难讲清楚啊……看代码好了……虽然代码可能更不清楚……

1 //minamoto 2 #include
3 using namespace std; 4 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 5 char buf[1<<21],*p1=buf,*p2=buf; 6 template
inline bool cmin(T&a,const T&b){
return a>b?a=b,1:0;} 7 template
inline bool cmax(T&a,const T&b){
return a
=sum2[i][j]) --t;26 q[++t]=j;27 if(q[h]<=j-B+D+1) ++h;28 mn[i][j]=sum2[i][q[h]];29 }30 }31 }32 void solve(){33 for(int j=D+1;j
=mn[i][j]) --t;37 q[++t]=i;38 if(q[h]<=i-A+C+1) ++h;39 cmax(res,sum1[i+1][j+1]-mn[q[h]][j]);40 }41 }42 }43 int main(){44 // freopen("testdata.in","r",stdin);45 n=read(),m=read(),A=read(),B=read(),C=read(),D=read();46 if(n==2||m==2) return puts("0"),0;47 for(int i=1;i<=n;++i) for(int j=1;j<=m;++j)48 sum[i][j]=read()+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];49 for(int i=A;i<=n;++i) for(int j=B;j<=m;++j)50 sum1[i][j]=sum[i][j]-sum[i-A][j]-sum[i][j-B]+sum[i-A][j-B];51 for(int i=C;i<=n;++i) for(int j=D;j<=m;++j)52 sum2[i][j]=sum[i][j]-sum[i-C][j]-sum[i][j-D]+sum[i-C][j-D];53 init(),solve();54 printf("%d\n",res);55 return 0;56 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9762165.html

你可能感兴趣的文章
hadoop命令执行hbase应用jar包时的环境变量加载问题
查看>>
awk常用注意事项--awk如何引用外部变量
查看>>
XenMobile学习文章总结
查看>>
Android开发者的混淆使用手册
查看>>
Telnet服务及协议
查看>>
SpringMVC深度探险
查看>>
关于vs2010巨慢(cpu占用高)的几种解决方式
查看>>
简单3步,轻松集成Testlink和MantisBT
查看>>
SQL语句教程(04) AND OR
查看>>
EBS 12.1.3 db 11.2.3 dg AND DG SWITCH OVER
查看>>
Oracle中的JOIN
查看>>
html中iframe控制父页面刷新
查看>>
每天一个linux命令(50):crontab命令
查看>>
linux命令7--cat命令&nl命令
查看>>
.NET底层开发技术
查看>>
RHEL regiester
查看>>
c/c++中的一些基础知识
查看>>
练习:输出整数每一位,计算算数,9出现次数,输出图案,水仙花数
查看>>
操作系统的发展
查看>>
HEVC码流简单分析
查看>>