bzoj 3289: Mato的文件管理 莫队+线段树
给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数。
先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的个数。
记得离散化。
#include<bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, a, n) for(int i = a; i<n; i++)
#define ull unsigned long long
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
const int maxn = ;
int a[maxn], ans[maxn], sum[maxn<<], b[maxn];
void pushUp(int rt) {
sum[rt] = sum[rt<<]+sum[rt<<|];
}
void update(int p, int l, int r, int rt, int val) {
if(l == r) {
sum[rt]+=val;
return ;
}
int m = l+r>>;
if(p<=m)
update(p, lson, val);
else
update(p, rson, val);
pushUp(rt);
}
int query(int L, int R, int l, int r, int rt) {
if(R<L)
return ;
if(L<=l&&R>=r) {
return sum[rt];
}
int m = l+r>>, ret = ;
if(L<=m)
ret += query(L, R, lson);
if(R>m)
ret += query(L, R, rson);
return ret;
}
struct node
{
int block, r, l, id;
bool operator < (node a)const
{
if(block == a.block)
return r<a.r;
return block<a.block;
}
}q[maxn];
int main()
{
int n, m;
while(~scanf("%d", &n)) {
for(int i = ; i<=n; i++) {
scanf("%d", &a[i]);
b[i-] = a[i];
}
sort(b, b+n);
int cnt = unique(b, b+n)-b;
for(int i = ; i<=n; i++)
a[i] = lower_bound(b, b+cnt, a[i])-b+;
scanf("%d", &m);
int BLOCK = sqrt(n*1.0);
for(int i = ; i<m; i++) {
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
q[i].block = q[i].l/BLOCK;
}
mem(sum);
sort(q, q+m);
int tmp = ;
for(int i = q[].l; i<=q[].r; i++) {
tmp += query(a[i]+, n, , n, );
update(a[i], , n, , );
}
ans[q[].id] = tmp;
for(int i = ; i<m; i++) {
for(int j = q[i-].l; j<q[i].l; j++) {
update(a[j], , n, , -);
tmp -= query(, a[j]-, , n, );
}
for(int j = q[i-].l-; j>=q[i].l; j--) {
tmp += query(, a[j]-, , n, );
update(a[j], , n, , );
}
for(int j = q[i-].r+; j<=q[i].r; j++) {
tmp += query(a[j]+, n, , n, );
update(a[j], , n, , );
}
for(int j = q[i-].r; j>q[i].r; j--) {
update(a[j], , n, , -);
tmp -= query(a[j]+, n, , n, );
}
ans[q[i].id] = tmp;
}
for(int i = ; i<m; i++) {
printf("%d\n", ans[i]);
}
}
return ;
}
bzoj 3289: Mato的文件管理 莫队+线段树的更多相关文章
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- BZOJ 3289: Mato的文件管理 莫队+BIT
3289: Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的 ...
- Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1539 Solved: 665[Submit][Status][Di ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- bzoj 3289 : Mato的文件管理 (莫队+树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3289 思路: 求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这 ...
- 【BZOJ3289】Mato的文件管理 莫队算法+树状数组
[BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...
- BZOJ 4129 树上带修莫队+线段树
思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...
- Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树
E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...
- 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线
正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...
随机推荐
- JSthis对象
第一章: this是javascript语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如 function test(){ ; } 随着函数使用场合的不同,this ...
- 对于windows窗口的标题菜单栏的操作——删除/禁用 最小最大话和关闭
HWND hand = FindWindow(NULL, "计算器"); int nStyle = GetWindowLong(hand, GWL_STYLE);nStyle &a ...
- U3D学习使用笔记(二)
1.在移动端www.texture使用时不能实时加载纹理,www.LoadImageIntoTexture使用没问题 2.public FaceFeature FaceFeatureData ...
- 查看mysql字符集及修改表结构
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...
- python初学笔记(二)
注释: 任何时候,我们都可以给程序加上注释.注释是用来说明代码的,给自己或别人看,而程序运行的时候,Python解释器会直接忽略掉注释,所以,有没有注释不影响程序的执行结果,但是影响到别人能不能看懂你 ...
- Microsoft Project 2010 简体中文专业版 + 永久激活密钥
Microsoft Project 2010 简体中文专业版 + 永久激活密钥 (2014-02-17 11:44:16) 转载▼ 标签: 文化 分类: 学习 Microsoft Project已成为 ...
- 最终有SpringMvc与Struts2的对照啦
眼下企业中使用SpringMvc的比例已经远远超过Struts2,那么两者究竟有什么差别,是非常多刚開始学习的人比較关注的问题,以下我们就来对SpringMvc和Struts2进行各方面的比較: 1. ...
- Android 开发佳站3
eclipse 某些java文件乱码 摘要: [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/archive/2013/04/24/3040219.h ...
- CTabCtrl - 如何使用TabCtrl控件
CTabCtrl - 如何使用TabCtrl控件 建立一个基于对话框的MFC应用程序TabCtrlTest Step 1:在资源视图中,新建对话框资源,资源ID:IDD_TabCtrlExample_ ...
- 部署SharePoint2013解决方案
Add-SPSolutionInstall-SPSolution -Identity Grain2013.wsp -GACDeployment -CompatibilityLevel {14,15} ...