vijos1459 车展

Posted poorpool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vijos1459 车展相关的知识,希望对你有一定的参考价值。

treap求中位数。

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, rot, siz, uu, vv;
ll h[1005], all, num, tmp, ans[1005][1005], cnt;
struct Node{
    int l, r, rnd, sze, hav;
    ll val, sum;
}nd[1005];
void upd(int k){
    nd[k].sze = nd[nd[k].l].sze + nd[nd[k].r].sze + 1;
    nd[k].sum = nd[nd[k].l].sum + nd[nd[k].r].sum + nd[k].val;
}
void lRotate(int &k){
    int t=nd[k].r; nd[k].r = nd[t].l; nd[t].l = k;
    nd[t].sze = nd[k].sze; upd(k); upd(t); k = t;
}
void rRotate(int &k){
    int t=nd[k].l; nd[k].l = nd[t].r; nd[t].r = k;
    nd[t].sze = nd[k].sze; upd(k); upd(t); k = t;
}
void ins(int &k, ll x){
    if(!k){
        k = ++siz; nd[k].sze = nd[k].hav = 1;
        nd[k].val = nd[k].sum = x; nd[k].rnd = rand();
        nd[k].l = nd[k].r = 0;
        return ;
    }
    nd[k].sze++;
    nd[k].sum += x;
    if(nd[k].val==x)    nd[k].hav++;
    else if(nd[k].val<x){
        ins(nd[k].r, x);
        if(nd[nd[k].r].rnd<nd[k].rnd)   lRotate(k);
    }
    else{
        ins(nd[k].l, x);
        if(nd[nd[k].l].rnd<nd[k].rnd)   rRotate(k);
    }
}
ll queryNum(int k, int x){
    if(!k)  return 0;
    if(nd[nd[k].l].sze>=x)  return queryNum(nd[k].l, x);
    else if(nd[nd[k].l].sze+nd[k].hav<x){
        num += nd[nd[k].l].sze + nd[k].hav;
        tmp += nd[nd[k].l].sum + nd[k].val * nd[k].hav;
        return queryNum(nd[k].r, x-nd[nd[k].l].sze-nd[k].hav);
    }
    else{
        num += nd[nd[k].l].sze;
        tmp += nd[nd[k].l].sum;
        return nd[k].val;
    }
}
int main(){
    cin>>n>>m;
    for(int i=1; i<=n; i++) scanf("%lld", &h[i]);
    for(int i=1; i<=n; i++){
        rot = all = siz = 0;
        for(int j=i; j<=n; j++){
            all += h[j];
            ins(rot, h[j]);
            num = tmp = 0;
            ll zws=queryNum(rot, (j-i+2)/2);
            ans[i][j] += num * zws - tmp;
            ans[i][j] += all - tmp - (j-i+1-num) * zws;
        }
    }
    for(int i=1; i<=m; i++){
        scanf("%d %d", &uu, &vv);
        cnt += ans[uu][vv];
    }
    cout<<cnt<<endl;
    return 0;
}

以上是关于vijos1459 车展的主要内容,如果未能解决你的问题,请参考以下文章

Vijos1459 车展 (数学)

Vijos1459 车展 (treap)

车展(vijos P1459)

以前的空间几道平衡树

vijos1460拉力赛

jzoj1209vijos1460拉力赛