链接:https://blog.youkuaiyun.com/VictoryCzt/article/details/83684082
HDU 2888 AC代码:
/**Wjvje**/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include<algorithm>
#include <set>
#include <queue>
#include <stack>
#include<vector>
#include<map>
#include<ctime>
/** -?£- **/
#define LL long long
#define par pair<LL,int>
#define INF 0x3f3f3f3f
using namespace std;
const int N=310;
const int M=4e5+100;
const int Log=9;
int maxv[Log][Log][N][N];
int pre[N],val[N][N];
void init(int n,int m)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)maxv[0][0][i][j]=val[i][j];
pre[2]=pre[3]=1;
for(int i=4,up=max(n,m); i<=up; i++)pre[i]=pre[i>>1]+1;
int up1=pre[n]+1,up2=pre[m]+1;
for(int l1=0; l1<up1; l1++)
{
for(int l2=0; l2<up2; l2++)
{
if(!l1&&!l2) continue;
for(int i=1; (i+(1<<l1)-1)<=n; i++)
{
for(int j=1; (j+(1<<l2)-1)<=m; j++)
{
if(l2)maxv[l1][l2][i][j]=max(maxv[l1][l2-1][i][j],maxv[l1][l2-1][i][j+(1<<(l2-1))]);
else maxv[l1][l2][i][j]=max(maxv[l1-1][l2][i][j],maxv[l1-1][l2][i+(1<<(l1-1))][j]);
}
}
}
}
}
int query(int x1,int y1,int x2,int y2)
{
int p=pre[x2-x1+1],q=pre[y2-y1+1];
int ans=-INF;
ans=max(maxv[p][q][x1][y1],maxv[p][q][x1][y2-(1<<q)+1]);
ans=max(ans,max(maxv[p][q][x2-(1<<p)+1][y1],maxv[p][q][x2-(1<<p)+1][y2-(1<<q)+1]));
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,q;
while(cin>>n>>m)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)cin>>val[i][j];
init(n,m);
int x1,x2,y1,y2;
cin>>q;
for(int i=1; i<=q; i++)
{
cin>>x1>>y1>>x2>>y2;
int ans=query(x1,y1,x2,y2);
cout<<ans<<" ";
//cout<<val[x1][y1]<<" "<<val[x1][y2]<<" "<<val[x2][y1]<<" "<<val[x2][y2]<<endl;
if(ans==val[x1][y1]||ans==val[x1][y2]||ans==val[x2][y1]||ans==val[x2][y2])
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}
return 0;
}
The end;