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

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

对于大的矩阵可以枚举;对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值

预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和,
然后对于求矩形区域的最小值,可以先将每行看做一个数列,对于每个点y,得到一个[y-(B-3),y]的最小值
处理完行后得到Minr[][],对每列的进行同样的操作,就可以得到Min[x][y]表示([x-A+3,x],[y-B+3,y])的最小矩形和
但是注意单调队列处理的是S2,S2表示的是C\(*\)D的和,not a single point!所以端点应该是([x-A+C+1],[y-B+D+1])

原先做过这样的套路题,还是费了近一下午==不行效率太低了

#include 
#include
//#define gc() getchar()#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)const int N=1005,MAXIN=6e5;int n,m,A,B,C,D,S[N][N],S1[N][N],S2[N][N],q[N],Minr[N][N];char IN[MAXIN],*SS=IN,*TT=IN;inline int read(){ int now=0,f=1;register char c=gc(); for(;!isdigit(c);c=gc()) if(c=='-') f=-1; for(;isdigit(c);now=now*10+c-'0',c=gc()); return now*f;}//void Debug(int a[N][N],int s,int s2)//{// puts("Debug");// for(int i=s; i<=n; ++i,putchar('\n'))// for(int j=s2; j<=m; ++j) printf("%d ",a[i][j]);// putchar('\n');//}void Pre(){ for(int i=C+1; i
=S2[i][j]) --t; q[++t]=j; if(q[h]<=j-B+D+1) ++h; Minr[i][j]=S2[i][q[h]]; } }// Debug(S,1,1);// Debug(S1,A,B);// Debug(S2,C,D);// Debug(Minr,2,2);}void Solve(){ int res=0; for(int j=D+1; j
=Minr[i][j]) --t; q[++t]=i; if(q[h]<=i-A+C+1) ++h; if(res

转载于:https://www.cnblogs.com/SovietPower/p/8470244.html

你可能感兴趣的文章
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
正则表达式
查看>>
【Html基础】之<h1>~<h6> <p> <br> <hr>
查看>>
爬取校园网新闻
查看>>
js事件冒泡机制
查看>>
.net面试题目101-130
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
orcale 修改字段属性
查看>>
多线程总结之旅(3):多线程的优缺点
查看>>
STL基础用法
查看>>
2019.7.7 校内测试题 分数化小数
查看>>
shell 计算时间差
查看>>
IDEA搭建基于maven的springboot工程
查看>>
SAE中使用Django发送邮件遇到的几个问题
查看>>
bmp文件格式详解
查看>>
MyEclipse 10.0,9.0,8.0 下添加jadClipse反编译插件
查看>>
Servlet 2 生命周期 ServletConfig 自定义缺省Servlet
查看>>
过滤器,监听器,拦截器
查看>>
能走多远,取决于你与谁同行
查看>>