結果
| 問題 | No.1148 土偶Ⅲ |
| ユーザー |
|
| 提出日時 | 2026-08-14 10:32:40 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,663 bytes |
| 記録 | |
| コンパイル時間 | 5,425 ms |
| コンパイル使用メモリ | 370,224 KB |
| 実行使用メモリ | 10,044 KB |
| 最終ジャッジ日時 | 2026-08-14 10:32:52 |
| 合計ジャッジ時間 | 7,994 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 2 WA * 23 |
ソースコード
#include <bits/stdc++.h>
#define ll long long
#define int long long
#define el '\n'
#define max6 1000000
#define pi pair<int,int>
#define debai "WISEQ"
using namespace std;
const int mxn = 1e6 + 5;
const int mod = 1e9 + 7;
const ll base = 331;
const ll inf = 3e18;
int n, m, ans,w;
vector<int> a;
vector<int> vals;
struct node {
int w,sz;
node() {
w = 0;
sz = 0;
}
};
struct segmenttree {
int n;
vector<node> st;
segmenttree(int n) {
this->n = n;
st.assign(4 * n + 5, node());
}
node merge(node left_node,node right_node) {
node cnt;
if(left_node.sz>right_node.sz){
cnt = left_node;
} else if (left_node.w > right_node.w && left_node.sz == right_node.sz) {
cnt = left_node;
}else {
cnt = right_node;
}
return cnt;
}
void update(int idx, int val,int sz, int id, int l, int r) {
if (idx < l || idx > r) return;
if (l == r) {
st[id].w = max(st[id].w, val);
st[id].sz = max(st[id].sz,sz);
return;
}
int mid = (l + r) >> 1;
if (idx <= mid) update(idx, val,sz, id << 1, l, mid);
else update(idx, val,sz, id << 1 | 1, mid + 1, r);
st[id] = merge(st[id<<1], st[id<<1|1]);
}
node query(int u, int v, int id, int l, int r) {
if (v < l || r < u) return node();
if (u <= l && r <= v) return st[id];
int mid = (l + r) >> 1;
return merge(query(u, v, id << 1, l, mid), query(u, v, id << 1 | 1, mid + 1, r));
}
};
int get_rank(int id) {
return (lower_bound(vals.begin(), vals.end(), id) - vals.begin() + 1);
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
if (fopen(debai ".inp", "r")) {
freopen(debai ".inp", "r", stdin);
freopen(debai ".out", "w", stdout);
}
cin >> n >> w;
a.assign(n, 0);
for (int i = 0; i < n; ++i) cin >> a[i];
vals = a;
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
m = vals.size();
segmenttree st(m);
for (int i = 0; i < n; ++i) {
int cnt = get_rank(a[i]);
node max_pre = (cnt > 1) ? st.query(1, cnt - 1, 1, 1, m) : node();
int curr_dp = max_pre.w + a[i];
int curr_dp_sz=max_pre.sz + 1;
if(curr_dp > w) {
curr_dp = 0;
curr_dp_sz = 0;
}
ans = max(ans, curr_dp_sz);
//cout<<ans<<' '<<curr_dp<<' '<<curr_dp_sz<<el;
st.update(cnt, curr_dp,curr_dp_sz, 1, 1, m);
}
cout << ans;
return 0;
}