HDU 2888 Check Corners【二维RMQ】
2015-11-11 17:52
375 查看
题意:很简单就是求某一区间的最大值是不是在四个角落;
思路:因为矩阵是300*300的所以想到二维RMQ刚好内存也刚好卡;
二维RMQ初始化的时候要注意
当k=0时
ma[i][j][k][l]=max(ma[i][j][k][l-1],ma[i][j+(1<<(l-1))][k][l-1]);
当k≠0时
ma[i][j][k][l]=max(ma[i][j][k-1][l],ma[i+(1<<(k-1))][j][k-1][l]);
询问的话取两者之间的最大值。
思路:因为矩阵是300*300的所以想到二维RMQ刚好内存也刚好卡;
二维RMQ初始化的时候要注意
当k=0时
ma[i][j][k][l]=max(ma[i][j][k][l-1],ma[i][j+(1<<(l-1))][k][l-1]);
当k≠0时
ma[i][j][k][l]=max(ma[i][j][k-1][l],ma[i+(1<<(k-1))][j][k-1][l]);
询问的话取两者之间的最大值。
#include<stdio.h> #include<string.h> #include<algorithm> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<stack> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741824 #define llinf 4611686018285162540LL #define eps 1e-8 #define mod 9223372034707292160LL #define pi acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(int i=a;i<=b;i++) #define drep(i,a,b) for(int i=a;i>=b;i--) #define mset(x,val) memset(x,val,sizeof(x)) #define mcpy(x,y) memcpy(x,y,sizeof(y)) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define mpii(a,b) make_pair(a,b); #define NN 101010 #define MM 202020 using namespace std; typedef long long ll; typedef long double lb; typedef pair<int,int> pii; int n,m,q; int ma[303][303][9][9]; int mp[303][303]; void init(){ rep(i,1,n) rep(j,1,m) ma[i][j][0][0]=mp[i][j]; int len1=(int)(log(double(n))/log(2.0)); int len2=(int)(log(double(m))/log(2.0)); rep(k,0,len1) rep(l,0,len2) if(k+l){ rep(i,1,n) rep(j,1,m){ if(i+(1<<k)-1<=n&&j+(1<<l)-1<=m){ if(k) ma[i][j][k][l]=max(ma[i][j][k-1][l],ma[i+(1<<(k-1))][j][k-1][l]); else ma[i][j][k][l]=max(ma[i][j][k][l-1],ma[i][j+(1<<(l-1))][k][l-1]); } } } } int rmq(int x1,int y1,int x2,int y2){ int len1=(int)(log(double(x2-x1+1))/log(2.0)); int len2=(int)(log(double(y2-y1+1))/log(2.0)); x2 = x2-(1<<len1)+1; y2 = y2-(1<<len2)+1; int a=max(ma[x1][y1][len1][len2],ma[x1][y2][len1][len2]); int b=max(ma[x2][y1][len1][len2],ma[x2][y2][len1][len2]); return max(a,b); } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ rep(i,1,n) rep(j,1,m) scanf("%d",&mp[i][j]); init(); scanf("%d",&q); int r1,r2,c2,c1; rep(i,1,q){ scanf("%d%d%d%d",&r1,&c1,&r2,&c2); if(r1>r2)swap(r1,r2); if(c1>c2)swap(c1,c2); int tmp=rmq(r1,c1,r2,c2); printf("%d ",tmp); if(tmp==mp[r1][c1]||tmp==mp[r1][c2] ||tmp==mp[r2][c1]||tmp==mp[r2][c2]) printf("yes\n"); else printf("no\n"); } } return 0; }
相关文章推荐
- SCRIPT5022: Sys.WebForms.PageRequestManagerServerErrorException: 输入字符串的格式不正确。
- poi操作Excel表格
- linux串口驱动分析【转】
- jQuery对象长度size
- WPF/ASP.NET:几个Prism中的术语
- WebSphereMq使用JMS发送消息和接收消息
- webview添加cookie有时失效
- SpriteBuilder中使用Node类型的ccb动画节点删除时崩溃的问题
- 【选型】常用的自动化测试工具
- SpriteBuilder中使用Node类型的ccb动画节点删除时崩溃的问题
- SpriteBuilder中使用Node类型的ccb动画节点删除时崩溃的问题
- 有穷自动机
- 创建与删除hive的表分区并指定目录
- Ubuntu zip解压乱码
- Discuz X3.2使用支付宝提供的担保交易
- Sping——框架面试题
- 553问题
- Spring MVC测试框架详解——服务端测试
- 加载png图片的两种方法 - GDI+和CImage
- Android之SurfaceView学习