这是我的第一个数据结构套数据结构

不是线段树套\(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]动态逆序对】的更多相关文章

  1. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  2. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  3. bzoj3295[Cqoi2011]动态逆序对 树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5987  Solved: 2080[Submit][Sta ...

  4. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  5. P3157 [CQOI2011]动态逆序对

    P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...

  6. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

  7. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  8. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

  9. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7465  Solved: 2662[Submit][Sta ...

  10. 洛谷 P3157 [CQOI2011]动态逆序对 解题报告

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...

随机推荐

  1. 利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载

    简述 可能大家都知道,php中有一个函数叫debug_backtrace,它可以回溯跟踪函数的调用信息,可以说是一个调试利器. 好,来复习一下 01 one(); 02 03 function one ...

  2. SpringMVC拦截器的实现单方登陆

    过滤器跟拦截器的区别 ①拦截器是基于java的反射机制的,而过滤器是基于函数回调.②拦截器不依赖与servlet容器,过滤器依赖与servlet容器.③拦截器只能对action请求起作用,而过滤器则可 ...

  3. Delegate背后的秘密

    表面上看来使用delegate是一件很简单的事. 用delegate关键字定义,使用老套的new创建一个instance ,使用熟悉的方法调用写法调用,只不过不在是方法名,而是委托名. 但是在这背后C ...

  4. Python Django ORM创建基本类以及生成数据结构

    #在项目目录下的modules.py中创建一个类,来自动生成一张表UserInfo class UserInfo(models.Model): username = models.CharField( ...

  5. python循环删除列表里的元素!漏删!

    li = [1,2,3,4,5,6] for i in li: if i<3: li.remove(i) print(li) #输出的结果是 [2,3,4,5,6]    2没有remove掉 ...

  6. jsp页面乱码

  7. 苹果ios,下拉菜单错位的问题(目前iphone x没发现有这个问题)

    苹果手机,点击下拉框,再点击确认按钮,页面位置错乱(感觉背景整体往上移动了一段距离,并且,页面所有的元素都往上移了一定的距离),导致手机页面底部留白的问题,并且,元素实际位置跟页面位置不一致. 解决方 ...

  8. 如何使用canvas进行2d绘图

    canvas 的 2D context 可以绘制简单的 2D 图形.它的 2D context 坐标开始于 <canvas> 元素的左上角,原点坐标是(0,0).所有的坐标值都基于这个原点 ...

  9. 改bug后 fix bug 时,一个不错的修复描述模板

    *问题原因:* 问题出现的原因.*解决方法:* 问题的解决方案.*影响分支:* 影响哪些分支. *相关修改:* 具体的修改文件列表.*自测结果:* 自行测试了哪些用例,将大概步骤描述出来. *影响功能 ...

  10. MySQL数据库(8)----表的创建、删除、索引和更改

    MySQL允许使用 CREATE TABLE 语句和 DROP TABLE 语句来创建.删除表,使用 ALTER TABLE 语句更改其结构.CREATE INDEX 语句和 DROP INDEX 语 ...