結果
| 問題 | No.3646 Decrement. |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-25 16:22:22 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,811 bytes |
| 記録 | |
| コンパイル時間 | 2,983 ms |
| コンパイル使用メモリ | 340,464 KB |
| 実行使用メモリ | 8,752 KB |
| 最終ジャッジ日時 | 2026-08-25 16:22:27 |
| 合計ジャッジ時間 | 5,444 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 1 |
| 小課題1 | 5 % | AC * 5 |
| 小課題2 | 5 % | AC * 3 |
| 小課題3 | 20 % | AC * 10 |
| 小課題4 | 30 % | AC * 19 |
| 小課題5 | 10 % | AC * 31 WA * 3 |
| 小課題6 | 30 % | AC * 40 WA * 5 |
| 合計 | 60 点 |
ソースコード
#include <bits/stdc++.h>
#include <cassert>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll,ll>;
using vb = vector<bool>;
using vi = vector<int>;
using vll = vector<long long>;
using vvi = vector<vi>;
using vvll = vector<vll>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vs = vector<string>;
using vc = vector<char>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define all(a) (a).begin(), (a).end()
#define uniq(v) sort(all(v)), (v).erase(unique(all(v)),(v).end())
#define lb(v,x) int(lower_bound(all(v),(x))-(v).begin())
#define ub(v,x) int(upper_bound(all(v),(x))-(v).begin())
#define rrep(i,n) for(int i = (int)(n) - 1; i>=0; i--)
#define rep1(i,n) for(int i=1; i <=(int)(n);i++)
#define reps(i,s,n) for(int i=(int)(s);i<(int)(n); i++)
#define koz " "
#define tor "\n"
template<class T> using min_pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> bool chmin(T& a, const T& b){if(b<a){a=b;return true;}return false;}
template<class T> bool chmax(T& a, const T& b){if(a<b){a=b;return true;}return false;}
template<typename T, typename U> T ceil(T x, U y){
assert(y!=0);
if(y<0) x=-x,y=-y;
return (x>0 ? (x+y-1)/y : x/y);
}
template<typename T, typename U> T floor(T x, U y){
assert(y!=0);
if(y<0) x=-x,y=-y;
return (x>0 ? x/y : (x-y+1)/y);
}
template<typename T> int popcnt(T x){return __builtin_popcountll(x);}
const int dx[]={1,0,-1,0,1,1,-1,-1};
const int dy[]={0,1,0,-1,1,-1,1,-1};
const int INF = 1045141919;
const ll LINF = 3643648101145141919;
void solve(){
ll n,k;
cin >> n >> k;
vll a(n);
rep(i,n) cin >> a[i];
ll ok=LINF,ng=-1;
auto judge=[&](ll x)->bool{
ll need=0;
rep(i,n){
if(x<a[i]) need+=a[i]-x;
}
if(need<=k) return true;
else return false;
};
while(abs(ok-ng)>1){
ll mid=ng+(ok-ng)/2;
if(judge(mid)) ok=mid;
else ng=mid;
}
ll cnt=0;
rep(i,n){
if(a[i]>ok) cnt+=a[i]-ok;
}
ll rem=k-cnt;
vll b(n);
rep(i,n) b[i]=min(a[i],ok);
vll c;
c.push_back(0);
rep(i,n) c.push_back(b[i]);
c.push_back(0);
min_pq<int> pq;
int now=0;
bool ok2=false;
for(int i=1;i<=n;){
int j=i;
while(j<=n&&c[j]==c[i]) j++;
if(c[i-1]<c[i]&&c[i]>c[j]) pq.push(j-i);
i=j;
}
ll ans=0;
rep(i,n)if(i) ans+=abs(b[i]-b[i-1]);
ans+=b[0]+b[n-1];
while(rem&&!pq.empty()){
int v=pq.top();
if(v>rem){
break;
}
rem-=v;
pq.pop();
ans-=2;
}
cout << ans << tor;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(16);
int _ = 1;
//cin >> _;
while(_--) solve();
}