【题目大意】

一共有n份,每份有一个大小和一个编号。Mato每天随机选一个区间[l,r],拷贝出来(即对原序列不影响),给它们排序,并且每次只能交换相邻两份文件。问每天最少交换几次?

【思路】

显然,每天最少交换次数=[l,r]逆序对的个数。离散化后,用莫队离线查询,用树状数组来维护当前的区间。

假设我们已经知道[l,r]的逆序对的个数,怎样才能求出[l-1,r],[l+1,r],[l,r-1]和l[r+1]呢?

随便考虑序列3,5,2,4,7,6,8,已知[2,4]逆序对的个数为2对。[l-1,r]逆序对的个数有3对,即加上比3小的个数;[l+1,r]逆序对的个数有0对,即减去比5小的个数;[l,r-1]有1对,即减去比4大的数的个数;[l,r+1]有2对,即加上比7大的数的个数,由此可以得出结论:

@AutSky_JadeK

①在一列数的后面添加一个数,逆序对数会增加 数列中比它大的数的个数。

②在一列数的后面删除一个数,逆序对数会减少 数列中比它大的数的个数。

③在一列数的前面添加一个数,逆序对数会增加 数列中比它小的数的个数。

④在一列数的前面删除一个数,逆序对数会减少 数列中比它小的数的个数。

时间复杂度为O(n^1.5*log(n))

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int num,pos;
bool operator < (const node &x) const {return num<x.num;}
};
struct queries
{
int l,r,pos,id,ans;
};
const int MAXN=+;
int n,m,size[MAXN],e[MAXN];
node tmpsize[MAXN];
queries q[MAXN];
bool cmp(queries a,queries b)
{
return (a.pos==b.pos)?a.r<b.r:a.pos<b.pos;
} bool cmpid(queries a,queries b)
{
return a.id<b.id;
} int lowbit(int x)
{
return (x&(-x));
} int sum(int p)
{
int ret=;
while (p>)
{
ret+=e[p];
p-=lowbit(p);
}
return ret;
} void modify(int p,int x)
{
while (p<=n)
{
e[p]+=x;
p+=lowbit(p);
}
} void init()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&tmpsize[i].num);
tmpsize[i].pos=i;
}
sort(tmpsize+,tmpsize+n+);
for (int i=,j=;i<=n;i++)
{
if (i== || tmpsize[i].num!=tmpsize[i-].num) j++;
size[tmpsize[i].pos]=j;
}
scanf("%d",&m);
int block=int(sqrt(n));
for (int i=;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
q[i].pos=(q[i].l-)/block+;
}
sort(q+,q+m+,cmp);
} void query()
{
memset(e,,sizeof(e));
int l=,r=,ans=;
for (int i=;i<=m;i++)
{
while (l<q[i].l) modify(size[l],-),ans-=sum(size[l]-),l++;
while (l>q[i].l) l--,modify(size[l],),ans+=sum(size[l]-);
while (r>q[i].r) modify(size[r],-),ans-=r-l-sum(size[r]),r--;
while (r<q[i].r) r++,modify(size[r],),ans+=r-l+-sum(size[r]);
q[i].ans=ans;
}
sort(q+,q+m+,cmpid);
for (int i=;i<=m;i++) printf("%d\n",q[i].ans);
} int main()
{
init();
query();
return ;
}

【序列莫队+树状数组】BZOJ3289-Mato的文件管理的更多相关文章

  1. BZOJ_3289_Mato的文件管理_莫队+树状数组

    BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...

  2. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  3. bzoj3236 作业 莫队+树状数组

    莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  4. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  5. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  6. 51nod 1290 Counting Diff Pairs | 莫队 树状数组

    51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...

  7. 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)

    点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...

  8. HihoCoder 1488 : 排队接水(莫队+树状数组)

    描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ...

  9. BZOJ 3236 莫队+树状数组

    思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...

随机推荐

  1. elementui raido 单选框 循环渲染加:key

    <el-radio-group v-model="adminRole"> <el-radio v-for="item in adminRoles&quo ...

  2. IBM InfoSphere DataStage and QualityStage

    Info coms from https://www.ibm.com/support/knowledgecenter/en/SSZJPZ_9.1.0/com.ibm.swg.im.iis.ds.nav ...

  3. 【LabVIEW技巧】你可以不懂OOP,却不能不懂封装

    前言 大多数写LabVIEW程序的工程师都不是一个纯软的工程师,很多做硬件的.做机械的.甚至学化学的也会学习LabVIEW. 由于主要重心不在软件,所以LabVIEW程序基本上能用行,也就得到入门容易 ...

  4. 离线安装SDK

    1.下载android-sdk_rXX-windows.zip(XX为版本号,也可以下.exe版的不过没试过) 2.下载SDK 2.1.在浏览器输入http://dl-ssl.google.com/a ...

  5. RadioButton 带下划线切换的案例

    xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id=& ...

  6. 如何让Footer无论页面长短都在最底部, 并和正文保持固定高度?

    html结构: <div id="container"> <div id="content">页面正文</div> < ...

  7. leetcode 之Linked List Cycle(24)

    两个思路,一是用哈希表记录每个结点是还被访问过:二是定义两个快.慢指针,如果存在环的话,两个指针必定会在某位结点相遇. bool linkListNode(ListNode *head) { List ...

  8. 三:Storm设计一个Topology用来统计单词的TopN的实例

    Storm的单词统计设计 一:Storm的wordCount和Hadoop的wordCount实例对比

  9. poj 1088(记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 88560   Accepted: 33212 Description ...

  10. 操作cephfs的基本命令

    [前提是已有一个基本可用的ceph集群] 一,在指定节点上部署mds: ceph-deploy mds create ceph-node1 二,新建两个存储池,用于保存cephfs的数据和元数据. c ...