3289: Mato的文件管理

Time Limit: 40 Sec  Memory Limit: 128 MB
Submit: 2368  Solved: 971
[Submit][Status][Discuss]

Description

Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号。为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问。Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料。Mato有一个习惯,他总是从文件大小从小到大看资料。他先把要看的文件按编号顺序依次拷贝出来,再用他写的排序程序给文件大小排序。排序程序可以在1单位时间内交换2个相邻的文件(因为加密需要,不能随机访问)。Mato想要使文件交换次数最小,你能告诉他每天需要交换多少次吗?

Input

第一行一个正整数n,表示Mato的资料份数。
第二行由空格隔开的n个正整数,第i个表示编号为i的资料的大小。
第三行一个正整数q,表示Mato会看几天资料。
之后q行每行两个正整数l、r,表示Mato这天看[l,r]区间的文件。

Output

q行,每行一个正整数,表示Mato这天需要交换的次数。

Sample Input

4
1 4 2 3
2
1 2
2 4

Sample Output

0
2

HINT

Hint

n,q <= 50000

样例解释:第一天,Mato不需要交换

第二天,Mato可以把2号交换2次移到最后。

Source

[Submit][Status][Discuss]

小生的第二道莫队算法。易知一段区间内的最小交换次数就是这段区间内的逆序对数,这个可以通过用树状数组动态维护。树状数组是按权值组织的,当在区间右侧新加入一个元素时,新形成的逆序对数就是前面区间中严格大于该元素的元素个数,反之亦然,请客官自行推导吧(ノ*・ω・)ノ。

 #include <bits/stdc++.h>

 template <class T>
inline void read(T &num) {
register int neg = false;
register int bit = getchar(); while (bit <= '') {
if (bit == '-')
neg ^= neg;
bit = getchar();
} num = ; while (bit >= '') {
num = num*
+ bit - '';
bit = getchar();
} if (neg)num = -num;
} const int siz = ; int n, m, s, num[siz], tmp[siz], bit[siz], answer; struct query {
int l, r, id, ans;
}qry[siz]; inline bool cmp_lr(const query &A, const query &B) {
if (A.l / s != B.l / s)
return A.l < B.l;
else
return A.r < B.r;
} inline bool cmp_id(const query &A, const query &B) {
return A.id < B.id;
} inline void add(int k, int v) {
for (; k <= n; k += k&-k)bit[k] += v;
} inline int ask(int k) {
int ret = ;
for (; k >= ; k -= k&-k)ret += bit[k];
return ret;
} signed main(void) {
read(n); for (int i = ; i <= n; ++i)
read(num[i]); memcpy(tmp, num, sizeof(tmp)); std::sort(tmp + , tmp + + n); int tot = std::unique(tmp + , tmp + + n) - tmp; for (int i = ; i <= n; ++i)
num[i] = std::lower_bound(tmp, tmp + tot, num[i]) - tmp; read(m); for (int i = ; i <= m; ++i)
read(qry[i].l), read(qry[i].r), qry[i].id = i; s = sqrt(n); std::sort(qry + , qry + + m, cmp_lr); for (int i = , x = , y = ; i <= m; ++i) {
while (x < qry[i].l)answer -= ask(num[x] - ), add(num[x], -), ++x;
while (x > qry[i].l)--x, answer += ask(num[x] - ), add(num[x], +);
while (y < qry[i].r)++y, answer += ask(n) - ask(num[y]), add(num[y], +);
while (y > qry[i].r)answer -= ask(n) - ask(num[y]), add(num[y], -), --y;
qry[i].ans = answer;
} std::sort(qry + , qry + + m, cmp_id); for (int i = ; i <= m; ++i)
printf("%d\n", qry[i].ans);
}

@Author: YouSiki

BZOJ 3289: Mato的文件管理的更多相关文章

  1. BZOJ 3289 Mato的文件管理(莫队+离散化求逆序数)

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 2171  Solved: 891 [Submit][Status][ ...

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

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

  3. BZOJ 3289: Mato的文件管理 莫队+BIT

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

  4. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

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

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

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

  6. BZOJ 3289: Mato的文件管理 【莫队 + 树状数组】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3289 3289: Mato的文件管理 Time Limit: 40 Sec  Memory ...

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

    Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4325  Solved: 1757[Submit][Status][Discuss ...

  8. bzoj 3289 Mato的文件管理(莫队算法+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题意] 回答若干个询问:[l,r]区间内的逆序对个数. [思路] 莫队算法,B ...

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

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3289 思路: 求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这 ...

随机推荐

  1. centos7 无法启动网卡

    (1)需要指定一下hwaddr (2)onboot=yes /etc/sysconfig/network-script/

  2. 2014年年度工作总结--IT狂人实录

    2014年也是我人生最重要的一年,她见证了我的成长与蜕变,让我从一个迷茫的旅者踏上一条柳暗花明的路. 春宇之行 从春宇短暂的9个月,却经历常人难以想想的风风雨雨,首先要感谢春宇公司给我带来了安逸宽松的 ...

  3. 常用API——日期型函数Date

    上图 ·声明 var myDate = new Date(); //系统当前时间 var myDate = new Date(yyyy, mm, dd, hh, mm, ss); var myDate ...

  4. Ubuntu如何选择更新源

    刚装上Ubuntu, 决定先更新一下源. 虽然网上搜索提供了很多更新源,结果替换上实际使用的时候,却发现总是有404无法连接的情况. 后来查查资料,发现Ubuntu自己就提供了很多的源管理. 具体更新 ...

  5. MySQL如何导出带日期格式的文件

    一网友问在MySQL中如何只用SQL语句导出带日期格式的文件.觉得有点意思,于是尝试了一下.导出文件使用SELECT INTO OUTFILE 但是OUTFILE后面的值不能使用变量,所以只能使用动态 ...

  6. 正则表达式解析URL

    正则表达式: var match = /^((ht|f)tps?:)\/\/([\w-]+(\.[\w-]+)*\/){1}(([\w-]+(\.[\w-]+)*\/?)*)?(\?([\w\-\., ...

  7. thrift的lua实现

    最近要进行系统升级,后台的数据是根据城市区分的.担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口.接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift接口来根据坐标获取城市信息 ...

  8. Ubuntu安装Svn,提供http访问

    安装相关package sudo apt-get install subversion subversion-tools apache2 libapache2-svn apache2-utils 创建 ...

  9. 【2016-11-2】【坚持学习】【Day17】【微软 推出的SQLHelper】

    从网络上找到 微软原版本的SQLHelper,很多行代码.认真看了,学习了.  代码:  using System; using System.Data; using System.Xml; usin ...

  10. 洛谷P1262 间谍网络[强连通分量 BFS]

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...