結果
| 問題 |
No.165 四角で囲え!
|
| コンテスト | |
| ユーザー |
tottoripaper
|
| 提出日時 | 2015-03-13 00:12:56 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1,529 ms / 5,000 ms |
| コード長 | 2,087 bytes |
| コンパイル時間 | 855 ms |
| コンパイル使用メモリ | 46,336 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-26 03:18:42 |
| 合計ジャッジ時間 | 22,038 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 19 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:31:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
31 | scanf("%d %d", &N, &B);
| ~~~~~^~~~~~~~~~~~~~~~~
main.cpp:34:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
34 | scanf("%d %d %d", X+i, Y+i, P+i);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
// 辛い
#include <cstdio>
#include <vector>
#include <algorithm>
int N, B;
int X[400], Y[400], P[400];
int map[400][400], map2[400][400];
void compress(int (&x)[400]){
std::vector<int> v;
for(int i=0;i<N;i++){
v.push_back(x[i]);
}
std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
for(int i=0;i<N;i++){
int index = std::lower_bound(v.begin(), v.end(), x[i]) - v.begin();
x[i] = index;
}
}
int sum(int x1, int x2, int y1, int y2, int (&map)[400][400]){
return map[x2][y2] - (x1>0?map[x1-1][y2]:0) - (y1>0?map[x2][y1-1]:0) + (x1>0&&y1>0?map[x1-1][y1-1]:0);
}
int main(){
scanf("%d %d", &N, &B);
for(int i=0;i<N;i++){
scanf("%d %d %d", X+i, Y+i, P+i);
}
compress(X);
compress(Y);
for(int i=0;i<N;i++){
map[X[i]][Y[i]] = P[i];
map2[X[i]][Y[i]] = 1;
}
for(int i=0;i<N;i++){
for(int j=1;j<N;j++){
map[j][i] += map[j-1][i];
map2[j][i] += map2[j-1][i];
}
}
for(int i=0;i<N;i++){
for(int j=1;j<N;j++){
map[i][j] += map[i][j-1];
map2[i][j] += map2[i][j-1];
}
}
// for(int i=0;i<N;i++){
// for(int j=0;j<N;j++){
// printf("%d ", map[j][i]);
// }
// puts("");
// }
int res = 0;
for(int i=0;i<N;i++){
for(int j=i;j<N;j++){
for(int k=0;k<N;k++){
int lb = k, ub = N;
while(ub - lb > 1){
int mid = (lb+ub) / 2;
if(sum(i, j, k, mid, map) <= B){
lb = mid;
}else{
ub = mid;
}
}
// printf("%d, %d, %d: %d\n", i, j, k, lb);
if(sum(i, j, k, lb, map) > B){
continue;
}
res = std::max(res, sum(i, j, k, lb, map2));
}
}
}
printf("%d\n", res);
}
tottoripaper