bzoj 3289: Mato的文件管理 (莫队算法 + 树状数组)
2015-10-10 22:05
288 查看
3289: Mato的文件管理
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1102 Solved: 486
[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
41 4 2 3
2
1 2
2 4
Sample Output
02
HINT
Hintn,q <= 50000
样例解释:第一天,Mato不需要交换
第二天,Mato可以把2号交换2次移到最后。
莫队算法 + 树状数组
/*====================================================== # Author: whai # Last modified: 2015-10-10 16:19 # Filename: bzoj3289.cpp ======================================================*/ #include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <cstring> #include <string> #include <cmath> #include <set> #include <map> using namespace std; #define LL __int64 #define PB push_back #define P pair<int, int> #define X first #define Y second const int N = 5 * 1e5 + 5; struct Q { int l, r, id; }q ; int unit; int unit_id(Q a) { return (a.l - 1) / unit + 1; } bool cmp(Q a, Q b) { if(unit_id(a) == unit_id(b)) return a.r < b.r; return unit_id(a) < unit_id(b); } P a ; LL ans ; LL cur = 0; int BIT ; int lowbit(int x) { return x & -x; } LL sum(int x) { LL ret = 0; while (x > 0) { ret += BIT[x]; x -= lowbit(x); } return ret; } void update(int x, int v) { while (x < N) { BIT[x] += v; x += lowbit(x); } } void add(int x, int flag) { int tmp; if(flag) tmp = sum(N - 10) - sum(x); else tmp = sum(x - 1); cur += tmp; //cout<<"add"<<' '<<flag<<' '<<x<<' '<<tmp<<endl; update(x, 1); } void del(int x, int flag) { int tmp; if(flag) tmp = sum(N - 10) - sum(x); else tmp = sum(x - 1); cur -= tmp; //cout<<"del"<<' '<<flag<<' '<<x<<' '<<tmp<<endl; update(x, -1); } bool cmp1(P a, P b) { return a.Y < b.Y; } void gao(int n, int m) { sort(a + 1, a + 1 + n); for(int i = 1; i <= n; ++i) { a[i].X = i; } sort(a + 1, a + 1 + n, cmp1); unit = sqrt(n); sort(q, q + m, cmp); int L = 1, R = 0; for(int i = 0; i < m; ++i) { while(R < q[i].r) { ++R; add(a[R].X, 1); } while(R > q[i].r) { del(a[R].X, 1); --R; } while(L < q[i].l) { del(a[L].X, 0); ++L; } while(L > q[i].l) { --L; add(a[L].X, 0); } //cout<<q[i].l<<' '<<q[i].r<<' '<<cur<<endl; ans[q[i].id] = cur; } for(int i = 0; i < m; ++i) { printf("%lld\n", ans[i]); } } int main() { int n, m; scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%d", &a[i].X); a[i].Y = i; } scanf("%d", &m); for(int i = 0; i < m; ++i) { scanf("%d%d", &q[i].l, &q[i].r); q[i].id = i; } gao(n, m); return 0; }
相关文章推荐
- 操作系统学习4
- 《需求工程——软件建模与分析》读后感之一
- LeetCode刷题记录
- 2015年10月10日作业
- CreateCompatibleDC
- 心雨
- ARM编译工具
- 把16G iPhone 6 Plus 纯手工升级到 128G
- 心雨
- 离线安装eclipse的Maven插件
- zb的生日
- CTEX中无限期试用WinEdt的方法
- 总结一下工作中用到的Mybatis业务逻辑
- HDU 2680 Choose the best route (最短路+迪杰斯特拉)
- Android Studio开启虚拟机遇到HAX kernel module is not installed问题
- AT24C02的Stm32模拟读写IIC程序(续)
- bzoj 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)
- c++ primer学习笔记5_复合类型续2
- grd文件结构
- JavaBean