洛谷P1369 【矩形】題解
阿新 • • 發佈:2018-12-10
作為標籤黨的我首先點開標籤:貪心~~好有道理的樣子~~ 再來看資料範圍座標100以內,n<=300,~~資料好水的樣子~~ 於是我想列舉左上角和右下角的點,然後再加一遍迴圈,蠢裡蠢氣的交了上去,結果全T~~美滋滋~~。 於是冷靜分析,這是100的5次方,肯定不能過啊。但是好像100的4次方能過哦,於是結合最大加權矩形的做法:首先用一個數組記錄以(1,1)為左上角,(i,j)為右下角的矩形的權值和。 然後再來列舉左上角,右下角的座標(100的4次方),通過東拼西湊,算出矩形的權值和,然後按相同操作算出除去邊界的小矩形的權值,就是邊界的值了(即邊界上點的個數) 題目應該沒有提高+這麼難的。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,ans=0; int a[101][101]; int main() { scanf("%d",&n); for(register int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); a[x][y]+=1;//一個點就是一個1的權值 } for(register int x=1;x<=100;x++) for(register int y=1;y<=100;y++) a[x][y]+=a[x-1][y]+a[x][y-1]-a[x-1][y-1];//記錄以(1,1)為左上角,(x,y)為右下角的矩形的權值和 for(register int i=1;i<=99;i++) for(register int j=1;j<=99;j++) for(register int x=i+1;x<=100;x++) for(register int y=j+1;y<=100;y++) { int sum1=a[x][y]-a[x][j-1]-a[i-1][y]+a[i-1][j-1];//(大矩形的權值和)應該很好理解吧,不能理解的可以畫個圖感性理解,理性分析一下 int sum2=a[x-1][y-1]-a[x-1][j]-a[i][y-1]+a[i][j];//小矩形的權值和,同上 sum1-=sum2;//邊界的值 邊界上點的個數 ans=ans<sum1?sum1:ans;//和ans比較大小 } printf("%d",ans); return 0; }