排序(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
*/

最新文章

  1. html5 canvas 实现倒计时 功能
  2. 最流行的编程语言 JavaScript 能做什么?
  3. JArray数组每个JObject对象添加一个键值对
  4. hdu3555 Bomb (记忆化搜索 数位DP)
  5. Largest Rectangle in a Histogram(HDU1506)
  6. 深入分析Java Web技术(2) IO
  7. Sql server之路 (一)基础学习
  8. Eclipse Gtk+
  9. DP Hrbust1186青蛙过河
  10. 小技巧--字符串输入从a[1]开始
  11. shell编程备忘
  12. [Mobile Web]Web中如何分辨移动设备?(iPad、iPhone、Android)
  13. Instance of 的用法
  14. LINUX 笔记-文件属性相关命令
  15. 去掉xcode编译warning:ld: warning: directory not found for option &#39;-L
  16. BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
  17. es6(二)
  18. 表单传参,在action中的参数得不到
  19. 从零开始学习html(十五)css样式设置小技巧——下
  20. Python 3 实现定义跨模块的全局变量和使用

热门文章

  1. VS2017生成一个简单的DLL文件 和 LIB文件——C语言
  2. Devexpress xaf针对某个用户登录后在面板中设置导航无效的解决方法
  3. Wannafly挑战赛23
  4. Linux:PS查看进程信息,和查看tomcat内存等信息
  5. 怎样获取响应头: Response Header
  6. 基于Hadoop生态SparkStreaming的大数据实时流处理平台的搭建
  7. mycat sql timeout 问题解决
  8. ActiveMQ入门系列二:入门代码实例(点对点模式)
  9. Spring Boot启动流程分析
  10. mock.js学习之路一(Vue中使用)