LG1116 【车厢重组】
前言
看了大家的做法,什么冒泡排序,插入排序,树状数组,线段树,都好厉害呐,我都没想出来
但我发现竟然还没有人用主席树,于是我跟大家交流一下 主席树 做法
显然我们有
\(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 【车厢重组】的更多相关文章
- codevs 1683 车厢重组
1683 车厢重组 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥 ...
- codevs 1683 车厢重组(水题日常)
时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工 ...
- P1116 车厢重组
题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车 ...
- T1683 车厢重组 codevs
http://codevs.cn/problem/1683/ 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车 ...
- P1058 车厢重组
题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 \(180\) 度,则可以把相邻两节车厢的位置交换,用这种方法可 ...
- (Java实现) 车厢重组
[问题描述] 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排 ...
- Zerojudge解题经验交流
题号:a001: 哈囉 背景知识:输出语句,while not eof 题号:a002: 簡易加法 背景知识:输出语句,while not eof,加法运算 题号:a003: 兩光法師占卜術 背景知识 ...
- 暑假集训(1)第五弹 -----Rails(Uva514)
PopPush城市有一座著名的火车站.这个国家到处都是丘陵.而这个火车站是建于上一个世纪.不幸的是,那时的资金有限.所以只能建立起一条路面铁轨.而且,这导致这个火车站在同一个时刻只能一个轨道投入使用, ...
- UVA514 Rails
铁轨 PopPush城市有一座著名的火车站.这个国家到处都是丘陵.而这个火车站是建于上一个世纪.不幸的是,那时的资金有限.所以只能建立起一条路面铁轨.而且,这导致这个火车站在同一个时刻只能一个轨道投 ...
随机推荐
- Shiny+SQLite打造轻量级网页应用
参考: R语言核心技能:交互式展示Shiny 中文 R语言用Shiny包快速搭建交互网页应用 R七种武器之交互化展示包shiny 用R的shiny包写一个基因的ID转换小程序 https://gi ...
- JS-Object(2) 原型对象 ,prototype属性。
基础✅ prototype(✅) JS中的继承 使用JSON数据 构建对象实战 基础 关键字"this"指向了当前代码运行时的对象( 原文:the current object t ...
- Jamie and Binary Sequence (changed after round) CodeForces - 916B (贪心)
链接 大意: 求将n划分为k个2的幂的和, 且最大幂最小,字典序尽量大 比较简单的贪心练习题, 但放在div2的B题感觉偏难了..... 先只考虑最大幂最小, 首先注意到直接按n的二进制划分即可得到最 ...
- qxx项目大文件上传
1. 在做大文件上传的时候,要注意修改文件的配置,php.ini的配置,还有连接时间.这些东西都记不清了,明天需要问一下芳哥,然后遇到问题的时候就能自己解决了. 2. 然后就遇到一个很尴尬的问题:大文 ...
- 浅谈Linux
Linux系统最初由芬兰赫尔辛基大学的Andrew S.Tanenbaum写的MINIX操作系统演变而来,这是一个小型操作系统,主要用于教学,1991年1月,Tanenbaum的学生Linus Tor ...
- 悟空CRM框架下载模板
1.你可以把你要下载的模板放在这个项目的Public/excelmodel目录下,然后你就可以在页面中编写代码 你可以在下载按钮这里编写:onclick="window.location.h ...
- zzuli1731 矩阵(容斥)
1731: 矩阵 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 600 Solved: 106 SubmitStatusWeb Board Descr ...
- 4.2 event
using System; public delegate void DownloadStartHandler(object sender, DownloadStartEventArgs e); // ...
- 附录A——面向对象基础
在学习设计模式之前,C#语言中一些基本的面向对象的知识还是应该具备的,比如像继承.多态,接口.抽象类,集合.泛型等. A.2 类与实例 什么是对象? 一切事物(事和物)都是对象,对象就是可以看到.感觉 ...
- 感知器、logistic与svm 区别与联系
https://blog.csdn.net/m0_37786651/article/details/61614865 从感知器谈起 对于典型的二分类问题,线性分类器的目的就是找一个超平面把正负两类分开 ...