思路:

区间逆序数即是交换次数。

逆序数,可以用树状数组吧。

怎么处理区间变换的时候求逆序数啊。。

这里分成左边的增/删,右边的增/删

因为是按时序插入,

所以左边增,增一个数,计算:ans+=sun(cur_val-1)[比他小的数的个数]

那么删:删一个数,计算ans+=sun(cur_val-1)[比他小的数的个数]

右边增的话,赠一个数,是ans+=比该值大的数的个数,那也就是ans+=区间-比他小的个数

删除同理。

补:

突然意识到莫队的每次增加区间点都意味着这个点之前所造成的贡献/效果要先删除,

然后更新这个点,

计算这个点更新后造成的贡献/效果。

而这里的话,一个点给出的效果已经知道。

WA在了树状数组算数组元素v[i]前缀和,应该是sum(v[i]-1);

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII; const int N=5e4+10;
int c[N*4],n,q;
int pos[N],v[N];
vector<int>xs;
struct asd
{
int left,right,res,id;
} e[N];
bool cmp(asd x,asd y)
{
if(pos[x.left]==pos[y.left]) return x.right<y.right;
return x.left<y.left;
}
bool cmp_id(asd x,asd y)
{
return x.id<y.id;
} int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
while(x<N)
{
c[x]+=val;
x+=lowbit(x);
}
} int sum(int i)
{
int ans=0;
while(i)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
} int ans;
int solve()
{
memset(c,0,sizeof(c));
ans=0;
for(int i=0,L=1,R=0; i<q; i++)
{
while(R<e[i].right)//右增;
{
add(v[R+1],1);
ans+=R+1-L+1-sum(v[R+1]);//区间-比他小的数-他本身的数。
R++;
}
while(R>e[i].right)//右缩
{
ans-=R-L+1-sum(v[R]);//区间-比他小的数-他本身的数。
add(v[R],-1);
R--;
}
while(L<e[i].left)//左缩
{
ans-=sum(v[L]-1);
add(v[L],-1);
L++;
}
while(L>e[i].left)//左扩
{
add(v[L-1],1);
ans+=sum(v[L-1]-1);
L--;
}
e[e[i].id].res=ans;
}
} int main()
{
scanf("%d",&n);
int block=(int)sqrt(n);
for(int i=1; i<=n; i++)
{
scanf("%d",&v[i]);
xs.push_back(v[i]);
pos[i]=(i-1)/block+1;
}
sort(xs.begin(),xs.end());
for(int i=1;i<=n;i++)
v[i]=lower_bound(xs.begin(),xs.end(),v[i])-xs.begin()+1;
scanf("%d",&q);
for(int i=0; i<q; i++)
{
scanf("%d%d",&e[i].left,&e[i].right);
e[i].id=i;
}
sort(e,e+q,cmp);
solve();
for(int i=0; i<q; i++)
printf("%d\n",e[i].res);
return 0;
}
/*
4
1 4 2 3
2
1 2
2 4
5
9 8 5 3 2
1 */

BZOJ3289【莫队算法+树状数组+离散化】的更多相关文章

  1. HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)

    链接: https://vjudge.net/contest/308446#problem/C 题意: Chika gives you an integer sequence a1,a2,-,an a ...

  2. 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...

  3. BZOJ3289 Mato的文件管理(莫队算法+树状数组)

    题目是区间逆序数查询. 莫队算法..左或右区间向左或右延伸时加或减这个区间小于或大于新数的数的个数,这个个数用树状数组来统计,我用线段树超时了.询问个数和数字个数都记为n,数字范围不确定所以离散化,这 ...

  4. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

    [BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...

  5. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  6. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  7. BZOJ 3289:Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 题意:…… 思路:求交换次数即求逆序对数.确定了这个之后,先离散化数组.然后在后面插入元素的话 ...

  8. 【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r] ...

  9. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

随机推荐

  1. window下Jira+SQL Server部署+汉化+破解

    网上很多都是jira+mysql部署的文章,由于我现在有需求要用SQL Server数据库,因此就动手试了一下,参考网上许多文章,再加上自己的几次尝试,很快也成功了,分享出来. 全文章节: 一.事前准 ...

  2. (转)Java web 项目中文件路径

    文件路径分为绝对路径和相对路径,在项目中页面跳转.配置文件读写.文件上传下载等等许多地方都涉及到文件路径问题. 一篇好文转载于此:http://blog.csdn.net/shendl/archive ...

  3. 小白学开发(iOS)OC_ 字符串重组(2015-08-13)

    // //  main.m //  字符串重组 // //  Created by admin on 15/8/13. //  Copyright (c) 2015年 admin. All right ...

  4. Sping框架概述

    一.什么是spring框架 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,i ...

  5. OI中字符串读入和处理

    OI中字符串读入和处理 在NOIP的"大模拟"题中,往往要对字符串进行读入并处理,这些字符串有可能包含空格并以\n作为分割,传统的cin >> scanf() 等等,不 ...

  6. Python序列——列表

    列表是什么 1 创建列表 2 访问列表和更新列表 列表相关操作 内建函数对列表的支持 1 cmp 2 序列类型函数 列表内建函数 列表应用 1 堆栈 2 队列 1. 列表是什么 列表也是序列的一种.列 ...

  7. [usaco2009nov]奶牛的图片

    Farmer John希望给他的N(1<=N<=100,000)只奶牛拍照片,这样他就可以向他的朋友炫耀他的奶牛.这N只奶牛被标号为1..N.在照相的那一天,奶牛们排成了一排.其中第i个位 ...

  8. margin在块元素、内联元素中的区别 padding

    (1)margin在块元素.内联元素中的区别 HTML(这里说的是html标准,而不是xhtml)里分两种基本元素,即block和inline.顾名思义,block元素就是以”块”表现的元素(bloc ...

  9. HDU2068 RPG的错排 —— 错排

    题目链接:https://vjudge.net/problem/HDU-2068 RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Lim ...

  10. PHP截取中英文混合字符

    <?php //////////////////////////////////////////////////////////////////// // PHP截取中英文及标点符号混合的字符串 ...