【分块】【树状数组】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 ...
随机推荐
- 如何设置项目encoding为utf-8
1.鼠标右键点击项目,选择[properties] 2.选择[Resource],在Text file encoding里面选择UTF-8,点击[ok] 大功告成! 木头大哥所发的文章均基于自身实践, ...
- idea初学建立maven项目报错
原理,是因为你没把新创建好的maven项目给设置成一个可被tomcat部署的web项目 参考此博文,讲的非常详细: 归根到底是因为web项目的部署问题: 解决方案:在创建的到时候,idea下部会提示是 ...
- Input操作文件
在HTML表单中,可以上传文件的唯一控件就是<input type="file">. 注意:当一个表单包含<input type="file" ...
- CSS中z-index全解析
一.z-index解释 z-index属性决定了一个HTML元素的层叠级别,元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言.一个更高的z-index值意味着这个元素在叠层顺序中会更靠近 ...
- 单选按钮radio与文字如何对齐?
布局如下: <input type="radio" value="立即发送" name="a_1">立即发送 <input ...
- C++ 智能指针的简单实现
智能指针的用处:在c++中,使用普通指针容易造成堆内存的泄露问题,即程序员会忘记释放,以及二次释放,程序发生异常时内存泄漏等问题,而使用智能指针可以更好的管理堆内存.注意,在这里智能指针是一个类而非真 ...
- 最适合初学者学习的idea教程
https://github.com/judasn/IntelliJ-IDEA-Tutorial
- NYOJ 170 网络的可靠性 (数学)
题目链接 描述 A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助商.它将提供先进的网络协作技术,展示其"智能+互联"的生活概念,同时为参观者提供高品质的个人体 ...
- React第三次入门
传统HTML开发在处理越来越多的服务器数据和用户交互数据反应到复杂界面的时候,代码量越来越大,难以维护. Angular是基于MVVM的开发框架,重量级..不适用于移动端的web栈, 其UI组件的封装 ...
- 解决小米/红米手机无法进行jdwp调试的问题
问题描述:在逆向一个app,研究环境是一台红米2,需要使用jdwp接口,也就是ddms下面这个界面: 但神奇的是,同一台主机上,模拟器的进程可以显示在ddms界面上,红米2确一个进程都没有显示出来.c ...