排序(sort)
【问题描述】
有 n 个人依次站在小 A 面前。小 A 会依次对这 n 个人进行 m 次操作。
每次操作选择一个位置 k,将这 n 个人中的所有身高小于等于当前 k 位置的
人的身高的人从队伍里拎出,然后按照升高从矮到高的顺序从左到右依次插入到
这些人原本的位置当中。
小 A 对这 n 个人身高构成的序列的逆序对很感兴趣。现在小 A 想要知道每一
次操作后这个序列的逆序对数。
【输入格式】
第一行 2 个整数 n 和 m,表示人数和操作数。
接下来一行 n 个整数 ai,表示初始状态从左到右每个人的身高。
接下来 m 行每行 1 个数,表示这次操作的 k。
【输出格式】
输出共 m+1 行,第 1 行表示未操作时的逆序对数量。
除第一行外第 i 行表示第 i-1 次操作后序列的逆序对数。
【样例输入】
6 2
160 163 164 161 167 160
2
3
【样例输出】
6
3
1
【样例解释】
第一次拎出 160、163、161、160
操作完后序列为 160 160 164 161 167 163
第二次拎出 160、160、164、161、163
操作完后的序列为 160 160 160 161 167 163
【数据范围】
对于 30%的数据,n,m≤500
对于 60%的数据,n,m≤1000
对于 100%的数据,n,m≤300000,1≤k≤n,,1≤ai≤10^9
 
sol:花式送分,大概就是当前大小之前的都不用管了,因为不影响答案了
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll N=;
ll n,m;
struct Node
{
ll id,num,val;
}a[N];
inline bool cmpnum(Node a,Node b){return a.num<b.num;}
inline bool cmpid(Node a,Node b){return a.id<b.id;}
struct BIT
{
ll S[N<<];
#define lowbit(x) ((x)&(-x))
inline void Ins(int x,int v)
{
while(x<=n)
{
S[x]+=v; x+=lowbit(x);
}
}
inline int Que(int x)
{
ll ans=;
while(x>)
{
ans+=S[x]; x-=lowbit(x);
}
return ans;
}
}T,BT;
signed main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
ll i,cv=,ans=,now=,oo;
R(n); R(m);
for(i=;i<=n;i++) R(a[a[i].id=i].num);
sort(a+,a+n+,cmpnum);
a[].val=++cv;
for(i=;i<=n;i++)
{
if(a[i].num==a[i-].num) a[i].val=cv; else a[i].val=++cv;
}
sort(a+,a+n+,cmpid);
for(i=n;i>=;i--)
{
ans+=(oo=T.Que(a[i].val-));
BT.Ins(a[i].val,oo);
T.Ins(a[i].val,);
}
Wl(ans);
for(i=;i<=m;i++)
{
ll pos; R(pos);
if(now<a[pos].val)
{
ans-=(BT.Que(a[pos].val)-BT.Que(now)); now=a[pos].val;
}
Wl(ans);
}
return ;
}
/*
input
6 2
160 163 164 161 167 160
2
3
output
6
3
1
*/

7.20T1的更多相关文章

  1. Scala 中的函数式编程基础(三)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  2. curl请求的url中含有空格

    curl请求的url中含有空格时(例如rul的参数是sql查询语句,url=www.tets.com/query.php?sql=select * from t1),curl_easy_perform ...

  3. MongoDB实战指南(七):MongoDB复制集之复制集工作机制

    http://www.cnblogs.com/longshiyVip/p/5097336.html 概述了复制集,整体上对复制集有了个概念,但是复制集最重要的功能之——自动故障转移是怎么实现的呢?数据 ...

随机推荐

  1. Statefulset的拓扑状态

    Statefulset: 实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,就被称为“有状态应用”(Stateful Application). StatefulSet 的设计其实非常容易理解 ...

  2. Codeforces 1097E. Egor and an RPG game

    传送门 首先考虑怎么算 $f(n)$ (就是题目里面那个 $f(n)$) 发现可以构造一组序列大概长这样: ${1,3,2,6,5,4,10,9,8,7,15,14,13,12,11,...,n(n+ ...

  3. MyBatis MyBatis Generator入门

    一.MGB功能简介 MyBatis Generator是一个代码生成工具. MBG是如何运行的呢?它会检查所连接到的数据库的一个或者多个table,然后生成可用来访问这些table的构建(Java代码 ...

  4. case when语法

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数: CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...

  5. oracle查看表空间及大小

    --1.查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tabl ...

  6. inter® management engine interface黄色感叹号解决方法

    win10今天安装电脑驱动时发现inter®  management engine interface怎么装都是黄色感叹号,所以做了下以下得测试 1.inter®  management engine ...

  7. K8S搭建过程随笔_系统初始化

    组件 Kubernetes 1.14.2 Docker 18.09.6-ce Etcd 3.3.13 Flanneld 0.11.0 基础环境设置 192.168.11.188 k8s-master ...

  8. qjson中把记录或类型或泛型数组转换为json字符串

    unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  9. js获取页面元素的位置

    一.网页的大小和浏览器窗口的大小 首先,要明确两个基本概念. 一张网页的全部面积,就是它的大小.通常情况下,网页的大小由内容和CSS样式表决定. 浏览器窗口的大小,则是指在浏览器窗口中看到的那部分网页 ...

  10. keeping

     很多时候我们总是低估了自己,对自己不够狠,从而错过了遇到一个更加优秀的自己.逼自己一把,很多事并不需要多高的智商,仅仅需要你的一份坚持,一个认真的态度,一颗迎难而上的决心