前言

看了大家的做法,什么冒泡排序,插入排序,树状数组,线段树,都好厉害呐,我都没想出来

但我发现竟然还没有人用主席树,于是我跟大家交流一下 主席树 做法

显然我们有

\(Ans=\sum_{i=1}^n\sum_{j=1}^{i-1}a_j\geq{}a_i\)

于是这样用主席树做

考虑每个\(i\)对\(Ans\)的贡献,发现只需要统计出大于\(a_i\)的数的个数,注意这些数应该是已经出现了的

用主席树维护答案,查询\(0\to{}i-1\)的历史版本,做法已经很明确了

最后分析时间复杂度

对每个\(i\)我们要先查询\([a_i+1,n]\)数的个数,需要\(O(\log_2n)\)时间,然后插入这个数也需要\(O(\log_2n)\)时间

因此总时间复杂度为\(O(n\log_2n)\)

放代码

#include<iostream>
#include<cstring>
using namespace std;

const int maxn=1e4+7;
struct PreSegTree
{
    int sum;
    int L,R;
}PST[maxn*16];
int root[maxn],cnt;

void insert(int&now,int l,int r,int x)
{
    PST[++cnt]=PST[now];
    now=cnt;
    ++PST[now].sum;
    if(l==r) return;
    int mid=(l+r)>>1;
    if(x<=mid)
        insert(PST[now].L,l,mid,x);
    else if(x>=mid+1)
        insert(PST[now].R,mid+1,r,x);
}

int query(int i,int j,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)
        return PST[j].sum-PST[i].sum;
    int mid=(l+r)>>1;
    int ans=0;
    if(ql<=mid)
        ans+=query(PST[i].L,PST[j].L,l,mid,ql,qr);
    if(qr>=mid+1)
        ans+=query(PST[i].R,PST[j].R,mid+1,r,ql,qr);
    return ans;
}

int main()
{
    memset(PST,0,sizeof(PST));
    memset(root,0,sizeof(root));
    cnt=0;
    int n;
    cin>>n;
    int a,ans=0;
    for(int i=1;i<=n;++i)
    {
        cin>>a;
        if(a<n) // 注意a==n时统计要特判掉
            ans+=query(root[0],root[i-1],1,n,a+1,n);
        root[i]=root[i-1];
        insert(root[i],1,n,a);
    }
    cout<<ans<<endl;
}

LG1116 【车厢重组】的更多相关文章

  1. codevs 1683 车厢重组

    1683 车厢重组  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 白银 Silver   题目描述 Description 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥 ...

  2. codevs 1683 车厢重组(水题日常)

    时间限制: 1 s  空间限制: 1000 KB  题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工 ...

  3. P1116 车厢重组

    题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车 ...

  4. T1683 车厢重组 codevs

    http://codevs.cn/problem/1683/  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车 ...

  5. P1058 车厢重组

    题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 \(180\) 度,则可以把相邻两节车厢的位置交换,用这种方法可 ...

  6. (Java实现) 车厢重组

    [问题描述] 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排 ...

  7. Zerojudge解题经验交流

    题号:a001: 哈囉 背景知识:输出语句,while not eof 题号:a002: 簡易加法 背景知识:输出语句,while not eof,加法运算 题号:a003: 兩光法師占卜術 背景知识 ...

  8. 暑假集训(1)第五弹 -----Rails(Uva514)

    PopPush城市有一座著名的火车站.这个国家到处都是丘陵.而这个火车站是建于上一个世纪.不幸的是,那时的资金有限.所以只能建立起一条路面铁轨.而且,这导致这个火车站在同一个时刻只能一个轨道投入使用, ...

  9. UVA514 Rails

     铁轨 PopPush城市有一座著名的火车站.这个国家到处都是丘陵.而这个火车站是建于上一个世纪.不幸的是,那时的资金有限.所以只能建立起一条路面铁轨.而且,这导致这个火车站在同一个时刻只能一个轨道投 ...

随机推荐

  1. How to implement connection pool in spark streaming

    在spark streaming的文档里,有这么一段: def sendPartition(iter): # ConnectionPool is a static, lazily initialize ...

  2. JVM中对象的内存布局与访问定位

      一.对象的内存布局 已主流的HotSpot虚拟机来说,   在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填 ...

  3. php--------http 状态代码及其原因

    HTTP 400 - 请求无效HTTP 401.1 - 未授权:登录失败HTTP 401.2 - 未授权:服务器配置问题导致登录失败HTTP 401.3 - ACL 禁止访问资源HTTP 401.4 ...

  4. hdu 6396 Swordsman (技巧)

    大意: n个怪, m种能力值, 当自己所有能力值不低于某只怪时可以杀死它, 并获得它的所有能力, 求最大杀几只 将每只怪拆成$m$个, 排下序贪心即可, 复杂度$O(nm)$, 原题极其卡时间, 我的 ...

  5. node搭建本地服务器

    随着前端不断发展,node基本已经成为必备,在调试的时候经常需要服务器,在之前的做法通常是去下载一个phpstudy 或者 xampp等启动一个服务,作为一个前端人虽然可以借助各种工具,但是怎么能不懂 ...

  6. hdu2955(概率DP)

    The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g ...

  7. 登录XML

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orient ...

  8. gitlab永久设置密码

    在 .gitconfig 文件中加入: [credential]       helper = store .git-credentials close address

  9. Chrome nacl开启

    Chrome nacl开启

  10. onmouseover和onmouseout的bug

    脑子不好用了,一点东西要看几遍才能记住,学过的东西也要好几遍,悲哀. 习惯了jquery的hover,或者看过hover源码,或者是正美的<框架设计>,onmouseover和onmous ...