給你乙個n*m的二維陣列,a[i][j]表示第i行第j列的數字,現在求乙個最大面積(長乘寬)的子矩形,要求對於該子矩形每一行中相鄰的兩個數,a[i][j]和a[i][j+1],存在乙個整數k使得2的k次方同時小於等於a[i][j]和a[i][j+1],並且2的(k+1)次方大於a[i][j]和a[i][j+1],對於每一列中相鄰的兩個數,a[i][j]和a[i+1][j],不存在乙個整數k使得2的k次方同時小於等於a[i][j]和a[i+1][j],並且2的(k+1)次方大於a[i][j]和a[i+1][j]。(0
第一行輸入兩個數n,m
接下來n行,每行m個整數第i行第j列表示a[i][j](0
輸出乙個表示符合要求的最大矩形面積
4 41 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
6
對於樣例,面積為6的矩形如下
2 3
6 7
10 11
題解:判斷乙個數a與另乙個數b是否存在乙個k滿足可以用異或,令c=a^b,如果c同時小於a和b,則存在,否則則不存在。開三個陣列up,l,r存每個點上邊,左邊和右邊可以到達的最值,並且l和r不斷更新,每次不斷更新面積最大值即可。
#include#define fi first
#define se second
#define inf 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define new(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=1e6+8;
typedef long long ll;
typedef unsigned long long ull;
const ll mod=1e9+7;
const ull base=1e7+7;
using namespace std;
int a[2008][2008];
int l[2008][2008],r[2008][2008],u[2008][2008];
int main()
l[i][1]=1;r[i][m]=m;
int k;
for(int j=2;j<=m;j++)
else
}for(int j=m-1;j>=1;j--)
else}}
int maxa=0;
for(int i=1;i<=n;i++)
else
maxa=max(maxa,(r[i][j]-l[i][j]+1)*u[i][j]);}}
//cout
無聊的生活,無聊的世界
最近是越來越無聊勒呢,我發現最近的我好像有點神經.神經兮兮的,我承認我以前就愛說,愛瘋,愛鬧,但是八,最近好像比以前還嚴重勒呢.阿,阿,算一算好像好長時間沒出家門勒呢 蛤蛤,自從退學好像越來越頹廢勒,不點阿不點,你完了,你真的完了,誒阿,一天就在家呆著,吃喝拉撒睡玩.這小生活過的,蠻享受的,但是就是...
填數字(簡單題,太無聊了,得水水題)
托公尺發現了一種新的遊戲 填數字 每填寫一次數字 1 i 9 需要花費a i枚金幣,托公尺總共有n枚金幣.托公尺想知道他能得到的最大數字是多少.如果填不了請輸出 1。不需要用完所有金幣 第一行乙個數字n,表示金幣總數.第二行9個正整數,第i個數字表示填寫一次數字i所需要的金幣數.輸出滿足條件的最大數...
無聊的switch題,神奇的小想法
今天上c語言課要求使用switch語句做題 題目很無聊 輸入若干個成績 80為優秀 60 80為通過 60為失敗 更坑爹的是 請用switch語句完成以上問題 乍一看,這是一道純粹的if else題,很不方便用switch,畢竟switch語句不支援這種條件的判斷。老師用了一種很無聊的不想解釋的做法...