Submission #232559

# Submission time Handle Problem Language Result Execution time Memory
232559 2020-05-17T10:48:50 Z balbit Jakarta Skyscrapers (APIO15_skyscraper) C++14
0 / 100
5 ms 384 KB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

#ifdef BALBIT
#define bug(...) cerr<<"#"<<__LINE__<<": "<<#__VA_ARGS__<<" - ", _do(__VA_ARGS__)
template<typename T> void _do(T && x){cerr<<x<<endl;}
template<typename T, typename ...S> void _do(T && x, S&&...y){cerr<<x<<", "; _do(y...);}
#define IOS()
#else
#define bug(...)
#define IOS() ios::sync_with_stdio(0), cin.tie(0)
#define endl '\n'
#endif // BALBIT

//#define int ll
#define pii pair<ll, ll>
#define f first
#define s second

#define ALL(x) x.begin(), x.end()
#define SZ(x) (int)(x.size())
#define pb push_back

vector<pii> v;
int n;
const int maxn = 1e5+3;
vector<int> rbs, lbs;// right bounds and left bounds, separated and sorted
ll rps[maxn], lps[maxn];// right bounds and left bounds, separated and sorted and ps

struct node{
    node *lc=0, *rc=0;
    ll val=0;
    int sz=0;
} pool [10000000];
auto _ptr = pool;

inline ll getval(node *&o){return o?o->val:0;}
inline int getsz(node *&o){return o?o->sz:0;}

node* MO(node *o, ll l, ll r, ll p, int v) {
//    if (!o) o = new node();
    node * ret = new (_ptr++)node ();
    if (o) ret->lc = o->lc, ret->rc = o->rc, ret->val = o->val, ret->sz = o->sz;
//    ret -> val = o->val; ret->sz = o->sz;
    if (l == r) {
        bug(p);
        ret->val += v;
        ret->sz += 1;
//        if (ret->val == 20) bug(ret->val, ret->sz);
        return ret;
    }
//    if (!o->lc) o->lc = new node();
//    if (!o->rc) o->rc = new node();
    ll mid = (l+r)/2;
    if (p <= mid) {
        ret -> lc = MO(ret->lc, l, mid, p, v);
//        ret -> rc = o->rc;
    }
    else{
//        ret -> lc = o->lc;
        ret -> rc = MO(ret->rc, mid+1, r, p, v);
    }
    ret->val = getval(ret->lc) + getval(ret->rc);
    ret->sz = getsz(ret->lc) + getsz(ret->rc);
//    if (ret->val == 20) bug(ret->val, ret->sz);
    return ret;
}

pii QU(node *&o, ll l, ll r, int L, int R) {
     if (!o || l > R || r<L) return {0,0};
     if (l>=L && r <=R) return {o->val, o->sz};
     ll mid = (l+r)/2;
     pii A = QU(o->lc, l,mid, L, R);
     pii B = QU(o->rc,mid+1,r, L, R);
     return {A.f+B.f, A.s+B.s};
}

//void MOO(node *o, int l, int r, int p, int v) {
//    if (o == nullptr) o = new node();
//    if (l == r) {
//        o->val = p;
//        return;
//    }
//    int mid = (l+r)/2;
//    if (p <= mid) {
//        o -> lc = MO(o->lc, l, mid, p, v);
//    }
//    else{
//        o -> rc = MO(o->rc, mid+1, r, p, v);
//    }
//    o->val = getval(o->lc) + getval(o->rc);
//    o->sz = getsz(o->lc) + getsz(o->rc);
//}

vector<node*> lhistory, rhistory;
vector<int> lrev;

map<ll, int> segmp;

ll C(ll l, ll r) {
    if (l>r) swap(l,r);
    int L = lower_bound(ALL(rbs), l) - rbs.begin() -1;// right bounds less than l
    int R = upper_bound(ALL(lbs), r) - lbs.begin();// right bounds less than l

    ll re = 0;
    re += (lps[n] - lps[R]) - (n-R) * r;
    bug(re);
    bug(L+1);
    re += (L+1) * (l) - (rps[L+1]);
    bug(re);

    int lat = lower_bound(ALL(lrev), l, greater<int>()) - lrev.begin() - 1;
    int rat = lower_bound(ALL(rbs),  r) - rbs.begin()-1;
    bug(lat, rat);

    pii lq = QU(lhistory[lat+1], 0, 1e5+3, 0, (*prev(segmp.lower_bound(r+l))).s);
    pii rq = QU(rhistory[rat+1], 0, 1e5+3, (*(segmp.lower_bound(r+l))).s, 1e5+3);

    bug(lq.f, lq.s, rq.f, rq.s);

    re += lq.f - lq.s * l;
    re += rq.s * r - rq.f;

    return re;
}

ll RE;
vector<int> p;
int m;
node * lroot = 0, *rroot = 0;

void go(int il, int ir, int jl, int jr) {
    if (il > ir || jl > jr) return;
    int mid = (il + ir)/2;
    int best = -1;
    ll bestval = 2e18+3;

    for (int j = jl; j<=min(mid, p[j]); ++j) {
        ll tt = C(p[mid], p[j]);
        RE = min (RE, tt);
        if (tt < bestval) {
            best = j; bestval = tt;
        }
    }
    go(il, mid-1, jl, best);
    go(mid+1, ir, best, jr);

}

signed main(){
    IOS();
    int k; cin>>k>>n;
    ll re = 0;
    map<int, int> hv;
    for (int i = 0; i<n; ++i) {
        char x, x2;
        int l, r; cin>>x>>l>>x2>>r;
        re += abs(r-l);
        if (x == x2) {
        }else{
            if (r < l) swap(l,r);
            v.pb({l,r});
            rbs.pb(r);
            lbs.pb(l);
            hv[l]--;
            hv[r]--;
        }
    }
    n = SZ(v);
    lhistory.pb(nullptr);
    rhistory.pb(nullptr);
    sort(ALL(v), [&](pii a, pii b){return a.f>b.f;});
    vector<ll> fff;
    for (int i = 0; i<n; ++i) {
        fff.pb(v[i].f + v[i].s);
    }
    sort(ALL(fff));
    for (int i = 0; i<n; ++i) {
        segmp[fff[i]] = i;
    }
    segmp[-1]=-1;
    for (int i = 0; i<n; ++i) {
        lhistory.pb(MO(lhistory.back(), 0, 1e5+3, segmp[v[i].f+v[i].s], v[i].f));
    }
    sort(ALL(v), [&](pii a, pii b){return a.s<b.s;});
    for (int i = 0; i<n; ++i) {
//        if (v[i].s == 6) bug(v[i].s, v[i].f+v[i].s);
        rhistory.pb(MO(rhistory.back(), 0, 1e5+3, segmp[v[i].f+v[i].s], v[i].s));
    }
    sort(ALL(rbs));
    sort(ALL(lbs));
    lrev = lbs;
    sort(ALL(lrev), greater<int>());
    for (int i = 0; i<n; ++i) {
        rps[i+1] = rps[i] + rbs[i];
        lps[i+1] = lps[i] + lbs[i];
    }

//    int L, R;
//    while (cin>>L>>R) {
//        cout<<C(L, R)<<endl;
//    }
//
//    return 0;

    if (k == 1) {
        ll now = lps[n];
        bug(now);
        ll ans = now;
        ll x = 0;
        ll frt = n;
        for (pii ele : hv) {
            ll X = ele.f;
            now -= (X-x) * (frt);
            bug(X, now);
            ans = min(ans, now);
            frt += ele.s;
            x=X;
        }
//        if (ans == 1000000000000000ll) ans = 0;
        cout<<re + ans*2 + n<<endl;
    }else{
         m = SZ(hv);
         p.resize(m);
         RE = C(0,0);

        int _it = 0;
        for (pii ele : hv) {
            p[_it++] = ele.f;
        }
        go(0,m-1,0,m-1);
//        cout<<re + ans*2 + n<<endl;
        bug(RE);
        cout<<re + RE*2 + n<<endl;
    }

}
/*
2 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7
*/
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -