結果
| 問題 | No.165 四角で囲え! |
| コンテスト | |
| ユーザー |
T1610
|
| 提出日時 | 2026-10-20 01:44:27 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 107 ms / 5,000 ms |
| + 775µs | |
| コード長 | 3,388 bytes |
| 記録 | |
| コンパイル時間 | 5,111 ms |
| コンパイル使用メモリ | 386,944 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-10-20 01:44:46 |
| 合計ジャッジ時間 | 8,159 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 19 |
ソースコード
#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
#define rep(i, n) REP(i, 0, n)
#define REP(i, s, e) for (ll i = (s); i < (ll)(e); i++)
#define repr(i, n) REPR(i, n, 0)
#define REPR(i, s, e) for (ll i = (ll)(s - 1); i >= (ll)(e); i--)
#define all(r) r.begin(), r.end()
#define rall(r) r.rbegin(), r.rend()
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
template <typename T, typename U>
T chmax(T& a, const U& b) {
if (a >= b) return false;
a = b;
return true;
}
template <typename T, typename U>
T chmin(T& a, const U& b) {
if (a <= b) return false;
a = b;
return true;
}
void yes_no(bool f, string yes = "Yes", string no = "No") { cout << (f ? yes : no) << "\n"; }
template <typename T>
T getSum2D(const vector<vector<T>>& sum, int y1, int y2, int x1, int x2) {
// y1--;
// x1--;
return sum[y2][x2] - sum[y1][x2] - sum[y2][x1] + sum[y1][x1];
}
template <typename T>
void preCalcSum2D(vector<vector<T>>& sum) {
int H = sum.size(), W = sum[0].size();
for (int i = 1; i < H; i++) {
for (int j = 0; j < W; j++) {
sum[i][j] += sum[i - 1][j];
}
}
for (int i = 0; i < H; i++) {
for (int j = 1; j < W; j++) {
sum[i][j] += sum[i][j - 1];
}
}
}
template <typename T>
pair<vector<T>, vector<T>> zaatu(vector<T> a) {
int n = a.size();
auto rev = a;
sort(all(rev));
rev.erase(unique(all(rev)), rev.end());
vector<T> z(n);
rep(i, n) z[i] = lower_bound(all(rev), a[i]) - rev.begin();
return {z, rev};
}
void solve() {
ll n, b;
cin >> n >> b;
using T = tuple<ll, ll, ll>;
vector<T> a(n);
vl vx, vy;
rep(i, n) {
ll x, y, z;
cin >> x >> y >> z;
a[i] = {x, y, z};
// x-1, x+1 は入れず、元の座標だけを入れる(TLE対策)
vx.emplace_back(x);
vy.emplace_back(y);
}
auto [mx, rx_vec] = zaatu(vx);
auto [my, ry_vec] = zaatu(vy);
int h = ry_vec.size() + 2;
int w = rx_vec.size() + 2;
vector<vl> num(h, vl(w, 0));
vector<vl> score(h, vl(w, 0));
rep(i, n) {
// 2次元累積和の半開区間 (y1, y2] に合わせるため、+1 して 1-indexed で配置する
num[my[i] + 1][mx[i] + 1]++;
score[my[i] + 1][mx[i] + 1] += get<2>(a[i]);
}
preCalcSum2D(num);
preCalcSum2D(score);
ll ans = 0; // 1つも囲まない場合は 0 個なので初期値は 0
rep(ly, h) REP(ry, ly + 1, h) {
int rx = 0;
auto init_state = [&](int lx) {
rx = lx;
};
auto judge_r = [&](int lx, int r_next) {
return getSum2D(score, ly, ry, lx, r_next) <= b;
};
auto update = [&](int lx, int rx) {
chmax(ans, getSum2D(num, ly, ry, lx, rx));
};
// 上限を n ではなく w にする
rep(lx, w) {
if (rx < lx) init_state(lx);
// rx を進める前に、1つ先の rx + 1 が条件を満たすか判定する
while (rx + 1 < w && judge_r(lx, rx + 1)) {
rx++;
}
update(lx, rx);
}
}
cout << ans << "\n";
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int t = 1;
// multi-testcase
// cin >> t;
rep(ti, t) solve();
return 0;
}
T1610