BZOJ 3289 Mato的文件管理 莫队算法
来源:互联网 发布:出售备案域名 编辑:程序博客网 时间:2024/04/29 21:38
询问区间内逆序对的个数。
区间转移是
#include <cmath>#include <cstdio>#include <algorithm>using namespace std;const int N = 50005;int block[N], a[N], c[N], n; unsigned x[N], t[N];struct Query { int l, r, i; } q[N];bool operator< (const Query &a, const Query &b) { return block[a.l] == block[b.l] ? a.r < b.r : a.l < b.l; }int read() { int s = 0, f = 1; char ch = getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();} return s * f;}unsigned range = 0;void add(int i, int x) { for (; i <= n; i += i & -i) t[i] += x;}unsigned sum(int i) { unsigned sum = 0; for (; i; i -= i & -i) sum += t[i]; return sum;}void transform(int &l, int &r, unsigned &ans, int ql, int qr) { while (r < qr) ++r, add(c[r], 1), range += r - l + 1 - sum(c[r]); while (r > qr) add(c[r], -1), range -= r - l - sum(c[r]), --r; while (l < ql) add(c[l], -1), range -= sum(c[l] - 1), ++l; while (l > ql) --l, add(c[l], 1), range += sum(c[l] - 1); ans = range;}int main() { int i, l = 1, r = 0, m, sz; sz = (int) sqrt(n = read()); for (i = 1; i <= n; ++i) a[i] = c[i] = read(), block[i] = (i - 1) / sz + 1; sort(a + 1, a + n + 1); for (i = 1; i <= n; ++i) c[i] = lower_bound(a + 1, a + n + 1, c[i]) - a; m = read(); for (i = 1; i <= m; ++i) q[i].l = read(), q[i].r = read(), q[i].i = i; sort(q + 1, q + m + 1); for (i = 1; i <= m; ++i) transform(l, r, x[q[i].i], q[i].l, q[i].r); for (i = 1; i <= m; ++i) printf("%u\n", x[i]); return 0;}
unsigned果然比long long快。。
3289: Mato的文件管理
Time Limit: 40 Sec Memory Limit: 128 MB
Submit: 1529 Solved: 660
[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次移到最后。
0 0
- BZOJ 3289 Mato的文件管理 莫队算法
- bzoj 3289: Mato的文件管理(莫队算法)
- BZOJ 3289: Mato的文件管理 莫队算法
- 【BZOJ】【P3289】【Mato的文件管理】【题解】【莫队算法】
- BZOJ 3289 Mato的文件管理 莫队算法+树状数组
- BZOJ 3289 Mato的文件管理 莫队算法+树状数组
- BZOJ - 3289 Mato的文件管理(莫队算法+树状数组)
- [BZOJ 3289] Mato的文件管理 · 莫队算法 & 树状数组
- BZOJ 3289 Mato的文件管理 [ 离散化+莫队算法+线段树 ]
- bzoj 3289: Mato的文件管理 (莫队算法 + 树状数组)
- BZOJ 3289 Mato的文件管理 莫队算法+树状数组
- [BZOJ]3289: Mato的文件管理 树状数组 莫队算法
- bzoj 3289 Mato的文件管理 (莫队算法+区间逆序数)
- Mato的文件管理-莫队算法
- 3289: Mato的文件管理 莫队算法+树状数组
- 【BZOJ 3289】 Mato的文件管理
- bzoj 3289: Mato的文件管理
- BZOJ 3289 Mato的文件管理
- IO流归纳总结
- coderforces 138CMushroom Gnomes - 2线段树
- linux下解压缩jar包
- 101. Symmetric Tree
- Appium跑python脚本自动生成简单测试结果报告
- BZOJ 3289 Mato的文件管理 莫队算法
- Linux安装Mongodb
- CF 650A Watchmen
- 一个简答的生产者-消费者多线程模型
- Android学习第六课 计时器小应用
- hdoj--1716--排列2(暴力水题)
- 最小乘积
- 【iOS界面开发】视图开发技巧
- 使用CSS3线性渐变(linear-gradient)实现文本波浪线效果