結果
| 問題 |
No.335 門松宝くじ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-01-01 22:47:09 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 326 ms / 2,000 ms |
| コード長 | 2,877 bytes |
| コンパイル時間 | 2,197 ms |
| コンパイル使用メモリ | 208,100 KB |
| 最終ジャッジ日時 | 2025-02-09 22:54:22 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 10 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct SegTree {
int n;
vector<int> node;
SegTree(vector<int> v) {
int sz = v.size();
n = 1; while (n < sz) n *= 2;
node.assign(2*n-1, -1 << 30);
for (int i = 0; i < sz; i++) node[i+n-1] = v[i];
for (int i = n-2; i >= 0; i--) node[i] = max(node[2*i+1], node[2*i+2]);
}
void update(int x, int val) {
x += n - 1;
node[x] = val;
while (x > 0) {
x = (x - 1) / 2;
node[x] = max(node[2*x+1], node[2*x+2]);
}
}
int get(int a, int b, int k=0, int l=0, int r=-1) {
if (r < 0) r = n;
if (r <= a || b <= l) return -1 << 30;
if (a <= l && r <= b) return node[k];
int vl = get(a, b, 2*k+1, l, (l+r)/2);
int vr = get(a, b, 2*k+2, (l+r)/2, r);
return max(vl, vr);
}
};
int main() {
int N, M;
cin >> N >> M;
int ans = -1;
int Ma = -1;
for (int i = 0; i < M; i++) {
vector<int> E(N), mE(N);
for (int i = 0; i < N; i++) {
cin >> E[i];
mE[i] = -E[i];
}
SegTree st(E);
SegTree mst(mE);
int sum = 0;
for (int i = 0; i < N-1; i++) {
for (int j = i+1; j < N; j++) {
int vi = E[i], vj = E[j];
int maxi = 0;
if (vi < vj) {
int ma = st.get(i, j+1);
int mi = -mst.get(i, j+1);
if (ma == vj) {
if (mi != vi) {
maxi = max(maxi, vj);
}
} else {
maxi = max(maxi, ma);
}
ma = st.get(0, i+1);
if (ma != vi) {
maxi = max(maxi, max(ma, vj));
}
mi = -mst.get(j, N);
if (mi != vj) {
maxi = max(maxi, vj);
}
} else {
int ma = st.get(i, j+1);
int mi = -mst.get(i, j+1);
if (ma == vi) {
if (mi != vj) {
maxi = max(maxi, vi);
}
} else {
maxi = max(maxi, ma);
}
mi = -mst.get(0, i+1);
if (mi != vi) {
maxi = max(maxi, vi);
}
ma = st.get(j, N);
if (ma != vj) {
maxi = max(maxi, max(ma, vi));
}
}
sum += maxi;
}
}
if (Ma < sum) {
Ma = sum;
ans = i;
}
}
cout << ans << endl;
}