답안 #825396

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
825396 2023-08-14T19:32:42 Z grogu Chorus (JOI23_chorus) C++14
0 / 100
3 ms 5076 KB
#define here cerr<<"===========================================\n"
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#include <bits/stdc++.h>
#define ld double
#define ll long long
#define ull unsigned long long
#define llinf 100000000000000000LL // 10^17
#define iinf 2000000000 // 2*10^9
#define pb push_back
#define eb emplace_back
#define popb pop_back
#define fi first
#define sc second
#define endl '\n'
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pld pair<ld,ld>
#define all(a) a.begin(),a.end()
#define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;}
#define cer(a) {cerr<<#a<<": ";for(ll x_ : a) cerr<<x_<< " ";cerr<<endl;}
#define si(a) (ll)(a.size())
using namespace std;


#define maxn 100005
ll n,k;
ll a[2*maxn];
ll c[maxn];
ll ps[maxn];
ll sz = 0;
ll dp[maxn];
struct line{
    ll n,k,cnti;
    line(){n = llinf;k = 0;cnti = 0;}
    line(ll n_,ll k_,ll cnti_){n = n_,k = k_,cnti = cnti_;}
    ll operator()(ll x){
        return k*x+n;
    }
};
line t[2*maxn];
ll ls[2*maxn],rs[2*maxn],tsz = 0,root = 0;
void init(ll &v,ll tl,ll tr){
    if(!v) v = ++tsz;
    t[v] = line();
    if(tl==tr) return;
    ll mid = (tl+tr)/2;
    init(ls[v],tl,mid);
    init(rs[v],mid+1,tr);
}
void upd(ll v,ll tl,ll tr,line f){
    line g = t[v];
    if(tl==tr){
        if(f(tl)<g(tl)) t[v] = f;
        return;
    }
    ll mid = (tl+tr)/2;
    if(f(tl)>g(tl)) swap(f,g);
    if(f(mid)<=g(mid)){t[v] = f;upd(rs[v],mid+1,tr,g);}
    else{t[v] = g;upd(ls[v],tl,mid,f);}
}
line mini(line f,line g,ll i){
    if(f(i)<g(i)) return f;
    return g;
}
line get(ll v,ll tl,ll tr,ll i){
    if(tl==tr) return t[v];
    ll mid = (tl+tr)/2;
    if(i<=mid) return mini(get(ls[v],tl,mid,i),t[v],i);
    return mini(get(rs[v],mid+1,tr,i),t[v],i);
}
ll cnt[maxn];
ll check(ll x){
    multiset<pll> s;
    init(root,1,n);
    ll e = 1;
    s.insert({0,0});
    dp[0] = 0;
    cnt[0] = 0;
    for(ll i = 1;i<=n;i++){
        while(e<=i&&c[e]<=i){
            s.erase(s.find({dp[e-1],cnt[e-1]}));
            line f(ps[e-1]+dp[e-1],-e,cnt[e-1]);
            upd(root,1,n,f);
            e++;
        }
        dp[i] = llinf; cnt[i] = 0;
        if(si(s)){
            dp[i] = (*s.begin()).fi - x;
            cnt[i] = (*s.begin()).sc + 1;
        }
        line f = get(root,1,n,i);
        if(f(i) - ps[e-1] + e*i - x < dp[i]){
            dp[i] = f(i) - ps[e-1] + e*i - x;
            cnt[i] = f.cnti+1;
        }
        s.insert({dp[i],cnt[i]});
    }

    return cnt[n];
}
ll bs(){
    ll l = -1000000000000,r = 1000000000000,mid,rez;
    while(l<=r){
        mid = (l+r)/2;
        ll e = check(mid);
        if(e<=k){
            rez = mid;
            l = mid+1;
        }else r = mid-1;
    }
    check(rez);
    return dp[n]+cnt[n]*rez;
}
int main(){
	ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0);
    cin >> n >> k;
    string s; cin >> s;
    for(ll i = 1;i<=2*n;i++){
        if(s[i-1]=='A') a[i] = 1;
    }
    ll b = 0;
    for(ll i = 2*n;i>=1;i--){
        if(a[i]==1){
            c[++sz] = b;
        }else b++;
    }
    for(ll i = 1;i<=n;i++) ps[i] = ps[i-1] + c[i];
    //for(ll i = 0;i<=n;i++) ceri(dp[i],0,k);
    cout<<bs()<<endl;
	return (0-0);
}
/**
5 2
AABABABBAB

**/

Compilation message

chorus.cpp: In function 'long long int bs()':
chorus.cpp:112:24: warning: 'rez' may be used uninitialized in this function [-Wmaybe-uninitialized]
  112 |     return dp[n]+cnt[n]*rez;
      |                  ~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 2 ms 4976 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4968 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 2 ms 4948 KB Output is correct
11 Incorrect 2 ms 4948 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 2 ms 4976 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4968 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 2 ms 4948 KB Output is correct
11 Incorrect 2 ms 4948 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 2 ms 4976 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4968 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 2 ms 4948 KB Output is correct
11 Incorrect 2 ms 4948 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 2 ms 4976 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4968 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 2 ms 4948 KB Output is correct
11 Incorrect 2 ms 4948 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 2 ms 4976 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4968 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 2 ms 4948 KB Output is correct
11 Incorrect 2 ms 4948 KB Output isn't correct
12 Halted 0 ms 0 KB -