题意:

  给定一个序列,对于q个询问:(L,R)之间有几个逆序对?序列元素个数<=1000,q<=100000。只有1个测试例子。

思路:

  [L,R]的逆序对数量可以这么算,假设L<=K<R,将区间拆成两部分,那么[L,k]中的逆序对要算上, (k,R]中的逆序对也要算上,还有一些逆序对假设为(l,r),l在左部分,r在右部分。则应该是3部分来构成,设3部分为A,B,C,那么ans=A+B+C 。

  而如果将k移到最右边,比如k=R-1,那么区间拆成[L,k]和(K,R],而(K,R]其实就只有R一个元素,并不存在什么逆序对,所以B=0,那么ans=A+C,仅仅由两部分构成,就简单了。

  对于序列a,假设m[j][i]表示从j到i-1之间有几个大于a[i](如果知道了j到i-1之间有多少逆序对,那么再加上m[j][i]就是j到i之间的逆序对数了)。复杂度1k*1k。

  接着求答案了,假设ans[L][R]表示从L到R之间有多少个逆序对,那么ans[j][i]=ans[j][i-1]+m[j][i]。而我们知道ans[j][j]肯定为0,那么就能计算出其他的答案了。复杂度1k*1k。

(也可以对于每个询问才来求ans[L][R],复杂度10w*1k还是可以过的)

 #include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <set>
#include <map>
#define LL long long
using namespace std;
const int N=; int a[N];
int m[N][N];
int ans[N][N];
int n, q; void cal()
{
memset(m,,sizeof(m));
memset(ans,,sizeof(ans)); for(int i=; i<=n; i++)
{
for(int j=i-; j>; j--)
if(a[j]>a[i]) m[j][i]=m[j+][i]+; //计算在j~i-1之间比a[i]大的有几个
else m[j][i]=m[j+][i];
} for(int i= ;i<=n; i++)
for(int j=i+; j<=n; j++)
ans[i][j]=ans[i][j-]+m[i][j]; } int main()
{
//freopen("input.txt", "r", stdin);
int aa,bb;
while(~scanf("%d%d",&n,&q))
{
for(int j=; j<=n; j++)
scanf("%d",&a[j]); cal();
while(q--)
{
scanf("%d%d",&aa,&bb);
printf("%d\n",ans[aa][bb]);
}
} return ;
}

AC代码

HDU 5273 Dylans loves sequence (逆序对,暴力)的更多相关文章

  1. hdu 5273 Dylans loves sequence 逆序数简单递推

    Dylans loves sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  2. hdu 5273 Dylans loves sequence

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5273 Dylans loves sequence Description Dylans is give ...

  3. HDU 5273 Dylans loves sequence 暴力递推

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5273 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  4. HDU 5273 Dylans loves sequence【 树状数组 】

    题意:给出n个数,再给出q个询问,求L到R的逆序对的个数 先自己写的时候,是每次询问都重新插入来求sum(r)-sum(l) 果断T 后来还是看了别人的代码---- 预处理一下,把所有可能的区间的询问 ...

  5. HDU 5273 Dylans loves numbers(水题)

    题意:给出一个0≤N≤1018,求其二进制中有几处是具有1的,假设相连的1只算1处,比如1101011就是3处. 思路:一个个数,当遇到第一个1时就将flag置为1:当遇到0就将flag置为0.当遇到 ...

  6. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  7. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

  8. Hdu 5806 NanoApe Loves Sequence Ⅱ(双指针) (C++,Java)

    Hdu 5806 NanoApe Loves Sequence Ⅱ(双指针) Hdu 5806 题意:给出一个数组,求区间第k大的数大于等于m的区间个数 #include<queue> # ...

  9. hdu 5272 Dylans loves numbers

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5272 Dylans loves numbers Description Who is Dylans?Y ...

随机推荐

  1. CodeSite使用小结 转载

    一.要使用Codesite,需要引用csintf单元二.CodeSite的基本方法(一)AddCheckPoint方法codesite.AddCheckPoint 加入监测点(二)AddSeperat ...

  2. AIZU 2251

    Merry Christmas Time Limit : 8 sec, Memory Limit : 65536 KB Problem J: Merry Christmas International ...

  3. POJ 2724

    Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4014   Accepted: 1127 ...

  4. Linux网络编程10——使用UDP实现五子棋对战

    思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...

  5. BZOJ 2424: [HAOI2010]订货 费用流

    2424: [HAOI2010]订货 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月 ...

  6. JS面向(基于)对象编程--三大特征

    抽象 在讲解面向对象编程的三大特征前,我们先了解什么叫抽象,在定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板).这种研究问题的方法称为抽象. 封装 什么是封装? ...

  7. poj3415 Common Substrings(后缀数组,单调栈 | 后缀自动机)

    [题目链接] http://poj.org/problem?id=3415 [题意] A与B长度至少为k的公共子串个数. [思路] 基本思想是将AB各个后缀的lcp-k+1的值求和.首先将两个字符串拼 ...

  8. C#网页采集

    /// <summary> /// 返回提取数组 /// </summary> /// <param name="rex">正则</par ...

  9. linux 屏幕录像(recordmydesktop)

    需求:命令行工具进行屏幕录像ffcast ffmpeg 简单点的是recordmydesktop. 1. 安装: apt-get install gtk-recordmydesktop recordm ...

  10. 深度学习框架Caffe —— Deep learning in Practice

    因工作交接需要, 要将caffe使用方法及整体结构描述清楚. 鉴于也有同学问过我相关内容, 决定在本文中写个简单的tutorial, 方便大家参考. 本文简单的讲几个事情: Caffe能做什么? 为什 ...