【分块】【树状数组】bzoj3787 Gty的文艺妹子序列
题解懒得自己写了,Orz一发wangxz神犇的:
http://bakser.gitcafe.com/2014/12/04/bzoj3787-Gty%E7%9A%84%E6%96%87%E8%89%BA%E5%A6%B9%E5%AD%90%E5%BA%8F%E5%88%97-%E5%AE%98%E6%96%B9%E9%A2%98%E8%A7%A3/
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,op,sum;
struct BIT
{
int d[];
void add_node(int p,const int &v)
{for(;p<=n;p+=(p&(-p))) d[p]+=v;}
int query(int p)
{int res=; for(;p;p-=(p&(-p))) res+=d[p]; return res;}
}T[],S;
struct BIT2
{
int d[];
void add_node(int p,const int &v)
{for(;p<=sum;p+=(p&(-p))) d[p]+=v;}
void add_range(const int &L,const int &R,const int &v)
{add_node(L,v); if(R!=sum) add_node(R+,-v);}
int query(int p)
{int res=; for(;p;p-=(p&(-p))) res+=d[p]; return res;}
}Xs[],Ys[];
int sz,l[],x,y,r[],a[],num[],f[][],ans;
void makeblock()
{
sz=(int)(sqrt(n)/sqrt(log2(n))); if(!sz) sz=;
for(sum=;sum*sz<n;++sum)
{
l[sum]=r[sum-]+; r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
l[sum]=r[sum-]+; r[sum]=n;
for(int i=l[sum];i<=r[sum];++i) num[i]=sum;
}
void init_BITs()
{
for(int i=;i<=sum;++i)
{
T[i]=T[i-];
for(int j=l[i];j<=r[i];++j) T[i].add_node(a[j],);
}
}
void init_anss()
{
for(int i=;i<=sum;++i)
{
memset(S.d,,sizeof(S.d)); int pos=,res=;
for(int j=i;j<=sum;++j)
{
for(int k=l[j];k<=r[j];++k)
{
++pos;
S.add_node(a[k],);
res+=(pos-S.query(a[k]));
}
f[i][j]=res;
}
} memset(S.d,,sizeof(S.d));
}
int getMore(const int &L,const int &R,const int &v)
{return sz*(R-L+)-(T[R].query(v)-T[L-].query(v));}
int getLess(const int &L,const int &R,const int &v)
{return T[R].query(v-)-T[L-].query(v-);}
void Query()
{
if(num[x]+>=num[y])
{
int pos=; ans=;
for(int i=x;i<=y;i++)
{
pos++;
S.add_node(a[i],);
ans+=(pos-S.query(a[i]));
}
for(int i=x;i<=y;i++) S.add_node(a[i],-);
printf("%d\n",ans);
}
else
{
int pos=r[num[x]]-x+;
ans=f[num[x]+][num[y]-]+Xs[num[x]+].query(num[y]-)+Ys[num[y]-].query(num[x]+);
for(int i=r[num[x]];i>=x;--i)
{
ans+=(getLess(num[x]+,num[y]-,a[i])+S.query(a[i]-));
S.add_node(a[i],);
}
for(int i=l[num[y]];i<=y;++i)
{
pos++;
S.add_node(a[i],);
ans+=(pos-S.query(a[i])+getMore(num[x]+,num[y]-,a[i]));
}
for(int i=x;i<=r[num[x]];++i) S.add_node(a[i],-);
for(int i=l[num[y]];i<=y;++i) S.add_node(a[i],-);
printf("%d\n",ans);
}
}
void Update()
{
int Pre=,Nex=; int &xB=num[x];
for(int i=l[xB];i<x;++i) if(a[i]>a[x]) --Pre;
for(int i=l[xB];i<x;++i) if(a[i]>y) ++Pre;
for(int i=x+;i<=r[xB];++i) if(a[i]<a[x]) --Nex;
for(int i=x+;i<=r[xB];++i) if(a[i]<y) ++Nex;
int t1=T[xB-].query(a[x]);
int t2=T[xB-].query(y);
for(int i=;i<=xB;++i)
{
Xs[i].add_range(xB,sum,-((xB-i)*sz-(t1-T[i-].query(a[x]))));
Xs[i].add_range(xB,sum,(xB-i)*sz-(t2-T[i-].query(y))+Pre);
}
t1=T[xB].query(a[x]-);
t2=T[xB].query(y-);
for(int j=xB;j<=sum;++j)
{
Ys[j].add_range(,xB,t1-T[j].query(a[x]-));
Ys[j].add_range(,xB,T[j].query(y-)-t2+Nex);
}
for(int i=xB;i<=sum;++i)
{
T[i].add_node(a[x],-);
T[i].add_node(y,);
}
a[x]=y;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
makeblock(); init_BITs(); init_anss();
scanf("%d",&m);
for(;m;--m)
{
scanf("%d%d%d",&op,&x,&y); x^=ans; y^=ans;
if(!op) Query();
else Update();
}
return ;
}
【分块】【树状数组】bzoj3787 Gty的文艺妹子序列的更多相关文章
- BZOJ3787:Gty的文艺妹子序列(分块,树状数组)
Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...
- BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】
题目分析: 首先这种乱七八糟的题目就分块.然后考虑逆序对的统计. 一是块内的,二是块之间的,三是一个块内一个块外,四是都在块外. 令分块大小为$S$. 块内的容易维护,单次维护时间是$O(S)$. 块 ...
- BZOJ3787 : Gty的文艺妹子序列
将序列分成$\sqrt{n}$块,预处理出每两块之间的逆序对数,以及ap[i]表示前i块内数字出现次数的树状数组 预处理:$O(n\sqrt{n}\log n)$ 修改时,ap[i]可以在$O(\sq ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
- 【bzoj2141】排队 分块+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别, ...
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...
- BZOJ 3787: Gty的文艺妹子序列
3787: Gty的文艺妹子序列 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 186 Solved: 58[Submit][Status][Dis ...
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
随机推荐
- WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
今天学习WCF分布式开发步步为赢系列的15节:错误契约(FaultContract)与异常处理(ExceptionHandle).本节内容作为WCF分布式开发的一个重要知识点,无论在学习还是项目中都应 ...
- visio2013安装提示找不到Office.zh_cn\officeMUI.mis officemui.xml(转)
windoes10 已经安装office2013后,想安装Visio2013,报错如题所示.解决方法我采用的是方法二:解压缩office2013的ISO包,解压缩Visio2013的ISO包,安装Vi ...
- 存储过程-----DECLARE---实用注意事项
定义与使用变量时需要注意以下几点: ◆ DECLARE语句必须用在DEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前. ◆ DECLARE定义的变量的作用 ...
- 数据安全之MD5、SHA-1、CRC32区别
crc32 — 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式……:这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式 ...
- requests上传文件
""" requests上传文件时,如果文件名是中文,会导致上传失败,参考:https://www.cnblogs.com/liaofeifight/p/5807901. ...
- 【FIRST USE】第一次用git把代码上传到github
第一次使用某个东西总是充满了伤痛,我第一次用sed的时候,毁掉了我的所有源代码,第一次用git的时候一直提示不正确,后来解决了问题,便记录下来. 首先说明我的环境,我用的是虚拟机,上面运行的64位的c ...
- ZOJ 3598 Spherical Triangle球面几何公式应用
#include <map> #include <set> #include <list> #include <cmath> #include < ...
- 在 C# 中通过 P/Invoke 调用Win32 DLL
在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 | 更新日期 : 1/13/2005 Jason Clark 下载本文的代码: NET0307.exe ( ...
- 一段js代码的分析
function foo(a){ console.log(a+b); b=a+2; console.log(a+b); } foo(2); foo(3); var b=3; foo(4); 结果是: ...
- MVC架构中的controller的几种写法
开始写代码之前,我们先来看一下spring MVC概念.一张图能够清晰得说明. 除了controller,我们需要编写大量代码外,其余的都可以通过配置文件直接配置. MVC的本质即是将业务数据的抽取和 ...