結果

問題 No.165 四角で囲え!
ユーザー knewknowlknewknowl
提出日時 2015-04-20 00:25:43
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 1,991 ms / 5,000 ms
コード長 1,357 bytes
コンパイル時間 944 ms
コンパイル使用メモリ 73,016 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-06-07 19:07:48
合計ジャッジ時間 26,847 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 941 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 1,182 ms
5,376 KB
testcase_06 AC 240 ms
5,376 KB
testcase_07 AC 1 ms
5,376 KB
testcase_08 AC 2 ms
5,376 KB
testcase_09 AC 2 ms
5,376 KB
testcase_10 AC 2 ms
5,376 KB
testcase_11 AC 1,247 ms
5,376 KB
testcase_12 AC 1,845 ms
5,376 KB
testcase_13 AC 1,840 ms
5,376 KB
testcase_14 AC 1,842 ms
5,376 KB
testcase_15 AC 1,827 ms
5,376 KB
testcase_16 AC 1,860 ms
5,376 KB
testcase_17 AC 1,839 ms
5,376 KB
testcase_18 AC 1,991 ms
5,376 KB
testcase_19 AC 1,844 ms
5,376 KB
testcase_20 AC 1,840 ms
5,376 KB
testcase_21 AC 1,836 ms
5,376 KB
testcase_22 AC 1,846 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
int x[500],y[500],p[500];
map<int,int> MP;
int n,b;
int num[500][500],P[500][500];

void init(int* ar){
  MP.clear();
  for(int i=0;i<n;++i){
    MP[ar[i]]=1;
  }
  int s=1;
  for(map<int,int>::iterator it=MP.begin();it!=MP.end();++it) (*it).second=s++;
  for(int i=0;i<n;++i) ar[i]=MP[ar[i]];
}

int Num(int x1,int y1,int x2,int y2,int ar[500][500]){
  if(x1<x2) swap(x1,x2);
  if(y1<y2) swap(y1,y2);
  return ar[x1][y1]-ar[x1][y2-1]-ar[x2-1][y1]+ar[x2-1][y2-1];
}

int main(){
  cin>>n>>b;
  for(int i=0;i<n;++i) cin>>x[i]>>y[i]>>p[i];
  init(x);
  init(y);
  //  for(int i=0;i<n;++i) cout << x[i] << " " << y[i] << " " << p[i] << endl;
  
  for(int i=0;i<n;++i) num[x[i]][y[i]]++,P[x[i]][y[i]]=p[i];
  for(int i=0;i<=n;++i){
    for(int j=1;j<=n;++j){
      num[i][j]+=num[i][j-1];
      P[i][j]+=P[i][j-1];
    }
  }
  for(int j=0;j<=n;++j){
    for(int i=1;i<=n;++i){
      num[i][j]+=num[i-1][j];
      P[i][j]+=P[i-1][j];
    }
  }

  int ans = 0;
  for(int y1=1;y1<=n;++y1){
    for(int y2=y1;y2<=n;++y2){
      for(int r=1;r<=n;++r){
	int u=1,v=r;
	for(int m=0;m<10;++m){
	  int l=(u+v)/2;
	  if(Num(l,y1,r,y2,P)<=b) v=l;
	  else u=l;
	}
	if(Num(v,y1,r,y2,P)<=b) ans = max(ans,Num(v,y1,r,y2,num));
      }
    }
  }
  cout << ans << endl;
  return 0;
}
0