【序列莫队+树状数组】BZOJ3289-Mato的文件管理
【题目大意】
一共有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大的数的个数,由此可以得出结论:
①在一列数的后面添加一个数,逆序对数会增加 数列中比它大的数的个数。
②在一列数的后面删除一个数,逆序对数会减少 数列中比它大的数的个数。
③在一列数的前面添加一个数,逆序对数会增加 数列中比它小的数的个数。
④在一列数的前面删除一个数,逆序对数会减少 数列中比它小的数的个数。
时间复杂度为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的文件管理的更多相关文章
- BZOJ_3289_Mato的文件管理_莫队+树状数组
BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- 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 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
- HihoCoder 1488 : 排队接水(莫队+树状数组)
描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小 ...
- BZOJ 3236 莫队+树状数组
思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...
随机推荐
- MSSQL 数据库性能优化
优化数据库的注意事项: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化. 5.清理删除日志. SQL语句优化的基本原 ...
- LESS使用简介!
我真的真的极度痛苦. 原本用了那么久的LESS,一直都是用编译工具(考拉)进行编译的,今天试了试用less.js来搞,按官网的都一毛一样,然而!就是编译不出来! 我用来擦鼻涕的卫生纸都一下午用了大半卷 ...
- vue router mode 设置"hash"与"history"的区别
router官网的说明如下: ********************************************我是官网说明分隔符--开始**************************** ...
- ...args剩余参数用法
剩余参数语法允许我们将一个不定数量的参数表示为一个数组. function sum(...theArgs) { return theArgs.reduce((previous, current) ...
- GPU硬件加速
现代浏览器大都可以利用GPU来加速页面渲染.每个人都痴迷于60桢每秒的顺滑动画.在GPU的众多特性之中,它可以存储一定数量的纹理(一个矩形的像素点集合)并且高效地操作这些纹理(比如进行特定的移动.缩放 ...
- hdu 2717 Catch That Cow(广搜bfs)
题目链接:http://i.cnblogs.com/EditPosts.aspx?opt=1 Catch That Cow Time Limit: 5000/2000 MS (Java/Others) ...
- Java21个基础知识点
类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: (1) 装载:查找和导入Class文件: (2) 链接:把类的二进制 ...
- centos7系统安装配置
下载centos7 iso镜像 电脑里面本来有ubuntu系统,直接在u盘做好启动盘安装即可,选择手动分区(忘了),将原本ubuntu系统分区压缩200G.系统不要选择最小化,选择gnome的图形界面 ...
- Linux内核中内存cache的实现【转】
Linux内核中内存cache的实现 转自:http://blog.chinaunix.net/uid-127037-id-2919545.html 本文档的Copyleft归yfydz所有,使用 ...
- 【bzoj3223】文艺平衡树
#include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...