【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述
给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数。
分析:分块+树状数组
(PS:本题的CDQ分治解法见下一篇)
首先将序列分成T块,每一块开一个树状数组,并且先把最初的答案统计完成。
对于每一次删除,找到对应位置,考虑删除之后的增减情况:
①块内:直接暴力,对于左边,少了比它大的个数,对于右边,少了比它小的个数,
②块外:枚举每一块。对于左边,少了比它大的个数,对于右边,少了比它小的个数,。
然后把这个位置的数分别从数组和树状数组中删除,。
为了最小化时间,我们使,忽略,所以取即可。
小结
一些自己不容易出错的写法:
①本题数组使用*a的方法
②涉及lint,须检验 参数声明、变量声明、函数声明、输入输出
③同一行最多只能有一类函数,且不要与其他运算,否则使用tmp
④分块的问题,直接将块的大小设为确定值,并标记块的个数上限,还有就是(i-1)/unit+1的写法
⑤对于一个参数,如果需要作空间且需要枚举,若数值上的差>1,那么开两个参数
⑥对于一个整数a判断是否大于0,写作a>0,不要写作a
代码
#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long lint;
const int N=100010;
const int BLOCK_SIZE=1000;
const int BLOCK_NUM=101;
int n,m;
int a[N];
int loc[N];
lint t[N];
lint res;
int num;
lint tr[BLOCK_NUM][N];
inline int read(void)
{
int x=0; char c=getchar();
for (;!isdigit(c);c=getchar());
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x;
}
inline int lowbit(int i)
{
return i&-i;
}
inline void ins(lint *ta,int i,int add)
{
for (;i<=n;i+=lowbit(i)) ta[i]+=add;
}
inline lint query(lint *ta,int i)
{
lint sum=0;
for (;i;i-=lowbit(i)) sum+=ta[i];
return sum;
}
inline void update(int x)
{
int loca=loc[x],bel=(loca-1)/BLOCK_SIZE+1;
for (int i=BLOCK_SIZE*(bel-1)+1;i<loca;i++)
if (a[i]>0&&a[i]>x) res--;
for (int i=loca+1;i<=min(BLOCK_SIZE*bel,n);i++)
if (a[i]>0&&a[i]<x) res--;
lint tmp;
for (int i=1;i<bel;i++)
{
tmp=query(tr[i],n)-query(tr[i],x-1);
res-=tmp;
}
for (int i=bel+1;i<=num;i++)
{
tmp=query(tr[i],x-1);
res-=tmp;
}
a[loca]=0;
ins(tr[bel],x,-1);
}
int main(void)
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
n=read(),m=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=n;i++) loc[a[i]]=i;
lint tmp;
for (int i=n;i>=1;i--)
{
tmp=query(t,a[i]);
res=res+tmp;
ins(t,a[i],1);
}
int belo;
num=(n-1)/BLOCK_SIZE+1;
for (int i=1;i<=n;i++)
{
belo=(i-1)/BLOCK_SIZE+1;
ins(tr[belo],a[i],1);
}
for (int i=1;i<=m;i++)
{
printf("%lld\n",res);
update(read());
}
return 0;
}
【BZOJ 3295】动态逆序对 - 分块+树状数组的更多相关文章
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- BZOJ3295 动态逆序对(树状数组套线段树)
[Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6058 Solved: 2117[Submit][Status][D ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- 【Luogu】P3157动态逆序对(树状数组套主席树)
题目链接 md第一道在NOILinux 下用vim做的紫题.由于我对这个操作系统不是很熟悉,似乎有什么地方搞错了,md调死.(我还打了两遍代码,调了两个小时) 但是这道题并不难,就是树状数组套上主席树 ...
- BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...
- BZOJ 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
- AcWing 107. 超快速排序(归并排序 + 逆序对 or 树状数组)
在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 ...
随机推荐
- (2)redis的基本数据结构是动态数组
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; ]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针, ...
- MUI 微信 和支付宝支付 (前台代码)
<!-- 校园公告详情界面 用于显示校园公告的详情信息 在校园公告界面点击某一条目后 进入本界面查看详情 --> <!DOCTYPE html> <html> &l ...
- 年轻的团队Mono玩转Dalvik
真的很羡慕这样的一个团队,年轻充满斗志. 甲骨文和谷歌正就谷歌在Android中使用Java一案展开一场10亿美元的大较量.但是Java并非在Android中建立本地应用的唯一方法.事实上,它甚至不是 ...
- Duilib实现GroupBox控件
转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是 ...
- excel小写金额转换成中文大写
假设 假设数据在A1单元格 任何一个个单元格输入公式=TEXT(INT(A1),"[dbnum2]")&"元"&IF(INT(A1*10)-IN ...
- BZOJ 1797 最小割
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1797 题意:给出一个有向图,每条边有流量,给出源点汇点s.t.对于每条边,询问:(1)是 ...
- linux 中 ll 命令如何让查询结果按时间升序或降序排序?
-t选项的功能是使输出的结果将以时间降序排列.如果希望按时间的升序排列,可以使用管道符将返回的结果传入tac命令.用法示例:查询当前目录的文件并以降序排列: ll -t查询当前目录的文件并以升序排列: ...
- python介绍(转载)
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- window.location.hash
我们知道JavaScript中很早就提供了window.history对象,利用history对象的forward().go().back()方法能够方便实现不同页面之间的前进.后退等这种导航功能.但 ...
- 简单的poi导出excel文件
/**** 创建excel文件**/ 1 import java.io.FileOutputStream; import java.io.IOException; import java.util.C ...