【[CQOI2011]动态逆序对】
这是我的第一个数据结构套数据结构
不是线段树套\(Splay\),而是非常蛇皮的块状链表套树状数组
如果这里按照\(\sqrt{n}\)的大小来分块,那么就需要\(n\sqrt{n}\)的空间,可能开不下,于是我们按照\(1000\)分块,也就只会分出\(100\)个块,就能开下空间了
之后每一次查询的时候直接查询树状数组就好了,每次修改则非常的块,直接找到对应的块改动这个块的树状数组就好了
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define lowbit(x) ((x)&(-x))
#define re register
#define maxn 100005
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int a[maxn],b[maxn];
int l[1005],r[1005],sz[1005];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int c[maxn];
int bit[101][maxn];
int n,m,tot,len;
LL ans;
int to[maxn],vis[maxn];
inline void add(int x)
{
for(re int i=x;i<=n;i+=lowbit(i))
c[i]++;
}
inline int ask(int x)
{
int now=0;
for(re int i=x;i;i-=lowbit(i))
now+=c[i];
return now;
}
inline void get_pair()
{
for(re int i=1;i<=n;i++)
{
ans+=ask(n)-ask(a[i]);
add(a[i]);
}
}
inline void B_add(int o,int x,int val)
{
for(re int i=x;i<=n;i+=lowbit(i)) bit[o][i]+=val;
}
inline int B_ask(int o,int x)
{
int now=0;
for(re int i=x;i;i-=lowbit(i)) now+=bit[o][i];
return now;
}
inline void build_block()
{
len=1000;
int k=1;
while(k<=n)
{
l[++tot]=k;
r[tot]=min(n,k+len-1);
k=r[tot]+1;
for(re int i=l[tot];i<=r[tot];i++)
B_add(tot,a[i],1);
}
}
inline int get_num(int x)
{
if(x%len==0) return x/len;
return x/len+1;
}
inline void BL_change(int x)
{
vis[to[x]]=1;
int now=get_num(to[x]);
B_add(now,x,-1);
}
inline int BL_find_less(int x,int y,int val)
{
int num=0;
for(re int i=x;i<=y;i++)
if(!vis[i]&&a[i]<val) num++;
return num;
}
inline int BL_find_more(int x,int y,int val)
{
int num=0;
for(re int i=x;i<=y;i++)
if(!vis[i]&&a[i]>val) num++;
return num;
}
inline int find_less(int x,int y,int val)
{
int num=0;
for(re int i=1;i<=tot;i++)
{
if(x>l[i]&&y<r[i]) return BL_find_less(x,y,val);
if(x<=l[i]&&y>=r[i]) num+=B_ask(i,val);
else if(x<=l[i]&&y<r[i]) num+=BL_find_less(l[i],y,val);
else if(y>=r[i]&&x>l[i]) num+=BL_find_less(x,r[i],val);
}
return num;
}
inline int find_more(int x,int y,int val)
{
int num=0;
for(re int i=1;i<=tot;i++)
{
if(x>l[i]&&y<r[i]) return BL_find_more(x,y,val);
if(x<=l[i]&&y>=r[i]) num+=B_ask(i,n)-B_ask(i,val);
else if(x<=l[i]&&y<r[i]) num+=BL_find_more(l[i],y,val);
else if(y>=r[i]&&x>l[i]) num+=BL_find_more(x,r[i],val);
}
return num;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++) a[i]=read(),to[a[i]]=i;
get_pair(),build_block();
int x;
while(m--)
{
printf("%lld\n",ans);
x=read();
if(to[x]!=1) ans-=find_more(1,to[x]-1,x);
if(to[x]!=n) ans-=find_less(to[x]+1,n,x);
BL_change(x);
}
return 0;
}
【[CQOI2011]动态逆序对】的更多相关文章
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- P3157 [CQOI2011]动态逆序对
P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- 洛谷 P3157 [CQOI2011]动态逆序对 解题报告
P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...
随机推荐
- Unity 动态加载资源的方式。
方式 特点 用法 Resource.load 安装包会比较大 在Asset文件夹下建一个Resources命名的文件夹,在打包安装包时会把 Resources文件夹下的所有文件都打包进去,不管 ...
- golang学习之接口型函数
先说下使用接口型函数的好处: 1.不必将某个接口函数附在某个type上面,保证了命名随意 2. 可以直接调用函数或者使用该接口,两两不耽误 直接上代码吧: // interface_func proj ...
- Max Sum(经典DP)
求最长总和序列,状态转移方程:dp[i] = max(dp[i-1]+a[i].a[i]) 因为可能有负数,所以要判断dp是否大于0,如果小于0则序列中断,从中断点开始 起始点可以用数组s保存,有中断 ...
- java设计模式-----4、单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的一个实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. 其实,GoF对单例模式的定义是:保证一个类,只有一个实例存在 ...
- 如何在vscode里面调试js和node.js
一般大家调试都是在浏览器端调试js的,不过有些时候也想和后台一样在代码工具里面调试js或者node.js,下面介绍下怎样在vscode里面走断点. 1,用来调试js 一:在左侧扩展中搜索Debugge ...
- webpack打包踩坑之TypeError: Cannot read property 'bindings' of null
file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...
- 利用webstorm 快捷创建标签案例:
利用webstorm 快捷创建标签案例: .wrapper>(.sWrapper>input[class='sText']+span[class= 'btn']*3)+.flWrapper ...
- WC前的颓废——带花树
QAQ现在很不想写题解博客那就来写个算法吧QAQ... 带花树 题目 来看个题... UOJ79. 某机房里有\(n\)个OIer,其中有\(n\)个男生,\(0\)个女生.现在他们要两两配对. 有\ ...
- Microsoft Toolkit.exe激活office 2010方法
1.双击打开激活工具 2.点击下方的office图标. 3.选择Activation标签,下拉选择AutoKMS,点击Install,完成后点击Activate,即可.
- UX基础 - OmniGraffle新手指南
原文地址:http://beforweb.com/node/202,大半夜找到,作为使用手册 我发现一事儿,就是最近这些年,每到入职一个新公司的时候,听得东西往往会比多数时候听得更重更金属些,此时以S ...