排序(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. k8s之自定义指标API部署prometheus

    1.自定义指标-prometheus node_exporter是agent;PromQL相当于sql语句来查询数据; k8s-prometheus-adapter:prometheus是不能直接解析 ...

  2. [Vue]子组件与父组件之间传值

    1.父组件与子组件传值props 1.1定义父组件,父组件传递 inputText这个数值给子组件: //父组件 //引入的add-widget组件 //使用 v-bind 的缩写语法通常更简单: & ...

  3. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  4. FLEX AIR 读写安卓本地文件

    1.  目标: 将字节流图片保存在安卓本地路径,如 "/data/mypppd/"下, file = File.documentsDirectory.resolvePath(&qu ...

  5. redis 命令行操作报错

    向redis集群写数据抛异常:(error) MOVED 15342 2001:fecc:0:616::34:6383 原因是启动redis-cli时未以集群方式启动,即后面要加上 -c redis- ...

  6. ajax 请求二进制流 图片

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  7. 微信Emoji表情代码大全

    参考网址 因PC端微信表情包不全,部分表情在PC中有显示问题,手机端微信不存在此问题,或者可以使用文字[微笑]这种方式添加微信表情 含义 标准 DoCoMo KDDI 软银 谷歌 微信 ✂复制这列

  8. WinPE基础知识之导出表

    // 导出的东西包括函数(变量.类)地址,序号,函数(变量.类)名 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // ...

  9. ASE19团队项目alpha阶段model组 scrum6 记录

    本次会议于11月8日,19时整在微软北京西二号楼sky garden召开,持续15分钟. 与会人员:Kun Yan, Lei Chai, Linfeng Qi, Xueqing Wu, Yutong ...

  10. 【SpringBoot】整合日志框架

    一.日志框架概述 1.1 日志框架的产生 1.2 市面上的日志框架 二.SLF4j 使用与整合 2.1 如何在系统中使用SLF4j 2.2 如何整合日志框架 2.3 SpringBoot中的日志关系 ...