結果
| 問題 | No.3646 Decrement. |
| コンテスト | |
| ユーザー |
shobonvip
|
| 提出日時 | 2026-08-25 15:35:56 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 34 ms / 2,000 ms |
| + 824µs | |
| コード長 | 2,767 bytes |
| 記録 | |
| コンパイル時間 | 4,049 ms |
| コンパイル使用メモリ | 377,084 KB |
| 実行使用メモリ | 8,192 KB |
| 最終ジャッジ日時 | 2026-08-25 15:36:41 |
| 合計ジャッジ時間 | 7,245 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 1 |
| 小課題1 | 5 % | AC * 5 |
| 小課題2 | 5 % | AC * 3 |
| 小課題3 | 20 % | AC * 10 |
| 小課題4 | 30 % | AC * 19 |
| 小課題5 | 10 % | AC * 34 |
| 小課題6 | 30 % | AC * 45 |
| 合計 | 100 点 |
ソースコード
/**
author: shobonvip
created: 2026.08.25 15:14:34
**/
#include<bits/stdc++.h>
using namespace std;
//* ATCODER
#include<atcoder/all>
using namespace atcoder;
typedef modint998244353 mint;
//*/
/* BOOST MULTIPRECISION
#include<boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
//*/
typedef long long ll;
#define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++)
#define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--)
#define all(v) v.begin(), v.end()
template <typename T> bool chmin(T &a, const T &b) {
if (a <= b) return false;
a = b;
return true;
}
template <typename T> bool chmax(T &a, const T &b) {
if (a >= b) return false;
a = b;
return true;
}
template <typename T> T max(vector<T> &a){
assert(!a.empty());
T ret = a[0];
for (int i=0; i<(int)a.size(); i++) chmax(ret, a[i]);
return ret;
}
template <typename T> T min(vector<T> &a){
assert(!a.empty());
T ret = a[0];
for (int i=0; i<(int)a.size(); i++) chmin(ret, a[i]);
return ret;
}
template <typename T> T sum(vector<T> &a){
T ret = 0;
for (int i=0; i<(int)a.size(); i++) ret += a[i];
return ret;
}
struct UnionFind{
int n;
vector<int> par;
vector<int> l, r, v;
explicit UnionFind(int t): n(t), par(t,-1), l(t), r(t), v(t) {
iota(all(l), 0);
iota(all(r), 0);
}
void merge(int a, int b){
int x = find(a);
int y = find(b);
if (x == y) return;
if (-par[x] < -par[y]) swap(x, y);
chmin(l[x], l[y]);
chmax(r[x], r[y]);
v[x] = v[y];
par[x] += par[y];
par[y] = x;
return;
}
int find(int x){
if (par[x] < 0) return x;
return par[x] = find(par[x]);
}
};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n; ll k; cin >> n >> k;
vector<ll> a(n+2);
rep(i,1,n+1) {
cin >> a[i];
}
UnionFind uf(n + 2);
rep(i,0,n+2) {
uf.v[i] = a[i];
}
rep(i,0,n+1) {
if (a[i] == a[i+1]) {
uf.merge(i, i+1);
}
}
rep(len,1,n+1) {
for (int l=1; l<=n; l+=len) {
int g = uf.find(l);
int lft = uf.l[g];
int rgt = uf.r[g];
//cout << l << ' ' << g << ' ' << lft << ' ' << rgt << ' ' << len << endl;
if (lft + len - 1 == rgt) {
if (lft - 1 >= 0 && rgt + 1 <= n+1) {
if (uf.v[lft-1] < uf.v[g] && uf.v[g] > uf.v[rgt+1]) {
ll t = max(uf.v[lft-1], uf.v[rgt+1]);
int tar = min(k / len, uf.v[g] - t);
uf.v[g] -= tar;
k -= ll(tar) * len;
if (uf.v[lft-1] == uf.v[g]) {
uf.merge(lft-1, g);
g = uf.find(l);
}
if (uf.v[rgt+1] == uf.v[g]) {
uf.merge(rgt+1, g);
g = uf.find(l);
}
}
}
}
}
}
ll ans = 0;
rep(i,0,n+1) {
//cout << uf.v[uf.find(i)] << ' ';
if (uf.find(i) != uf.find(i+1)) {
ans += abs(uf.v[uf.find(i)] - uf.v[uf.find(i+1)]);
}
}
cout << ans << endl;
}
shobonvip