제출 #756673

#제출 시각아이디문제언어결과실행 시간메모리
756673ByeWorld휴가 (IOI14_holiday)C++14
100 / 100
2645 ms36760 KiB
#include"holiday.h"
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int MAXN = 1e5+10;
const int INF = 1e9;
typedef pair<ll,ll> pii;

int val[MAXN];
struct node {
    int l, r, mid; ll sum, cnt; 
    node *le, *ri;
    void bd(int l2, int r2){
        l = l2; r = r2; mid = (l+r)/2;
        sum = 0; cnt = 0;
        if(l==r) return;
        le = new node(); le->bd(l, mid);
        ri = new node(); ri->bd(mid+1, r);
    }
    ll que(int w){
        if(w<=0) return 0;
        if(cnt <= w) return sum;
        if(l == r) return 1ll*val[l]*w;
        if(ri->cnt >= w) return ri->que(w);
        return le->que(w - ri->cnt) + ri->que(ri->cnt);
    }
    pii upd(int x, int p){
        if(r<x || x<l) return {sum, cnt};
        if(l==r && l==x){
            sum += 1ll*val[x]*p; cnt += p;
            return {sum, cnt};
        }
        pii lupd = le->upd(x, p); pii rupd = ri->upd(x, p);
        sum = lupd.fi + rupd.fi; cnt = lupd.se + rupd.se;
        return {sum, cnt}; 
    }
} A;

int n, sta, d;
int a[MAXN];
map<int,int> idx;
ll ret = 0;
int le = 1, ri = 0;

void setlr(int l,int r){
    while(le < l){
        A.upd(idx[a[le++]], -1);
    } //mid-1, out
    while(le > l){
        A.upd(idx[a[--le]], 1);
    } //mid, in
    while(ri < r){
        A.upd(idx[a[++ri]], 1);
    } //optl, in
    while(ri > r){
        A.upd(idx[a[ri--]], -1);
    } //optr+1, out
}

void solve(int l, int r, int optl, int optr){
    if(l > r) return;
    int mid = (l+r)/2, opt;
    ll dp = -INF; //cari value mid
    // mid - le udh ke build
    if(ri-optl <= optr-ri){
        for(int i=optl; i<=optr; i++){
            setlr(mid,i);
            // mid - i
            // d-(sta-mid)-(i-mid)
            ll can = A.que(d-sta + 2*mid - i);
            //cout << mid << ' ' << i << ' ' << can << "que\n";
            if(dp < can){
                dp = can;
                opt = i;
            }
        }
        solve(mid+1, r, opt, optr); solve(l, mid-1, optl, opt); 
    } else {
        for(int i=optr; i>=optl; i--){
            setlr(mid,i);
            ll can = A.que(d-sta + 2*mid - i);
            //cout << mid << ' ' << i << ' ' << can << "que\n";
            if(dp <= can){
                dp = can;
                opt = i;
            }
        }
        solve(l, mid-1, optl, opt); solve(mid+1, r, opt, optr); 
    }
    //cout << mid << ' '<< opt << ' ' << dp << "dp\n";
    ret = max(ret, dp);
}

long long int findMaxAttraction(int N, int start, int D, int X[]) {
	n = N; sta = start; d = D;
    sta++;
    set <int> s;
	for(int i=0; i<=n-1; i++){
        a[i+1] = X[i];
        s.insert(a[i+1]);
    }
    int index = 0;
    for(auto in : s){
        idx[in] = ++index;
        val[index] = in;
        //cout << in << ' ' << index << "ind\n";
    }
    
    //cout << "\nA\n";
    le = sta; ri = sta-1;
    A.bd(1, MAXN);
    solve(1, sta, sta, n);

	for(int i=1; i<n-i+1; i++) swap(a[i], a[n-i+1]);
	sta = n-sta+1;
    //cout << "\nB\n";
    le = sta; ri = sta-1;
	A.bd(1, MAXN);
    solve(1, sta, sta, n);

	return ret;
}

컴파일 시 표준 에러 (stderr) 메시지

holiday.cpp: In function 'void solve(int, int, int, int)':
holiday.cpp:90:42: warning: 'opt' may be used uninitialized in this function [-Wmaybe-uninitialized]
   90 |         solve(l, mid-1, optl, opt); solve(mid+1, r, opt, optr);
      |                                     ~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...