【分块】【树状数组】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 ...
随机推荐
- MAVEN 编译打包测试 指定本地jar
转载自:http://penuel.iteye.com/blog/1766102 maven对于互联网开发,进行版本管理有着不可或缺的作用; 而经常开发的程序猿直接联调或者依赖未上线或deploy的 ...
- netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例
网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/2 ...
- UITableView学习之辨析两个方法:⓵dequeueReusableCellWithIdentifier与⓶dequeueReusableCellWithIdentifier:forIndexPath:
使用storyboard显示UITableView时,如果不修改系统默认生成的tableView:cellForRowAtIndexPath:方法中的代码,必须为UITableViewCell注册(填 ...
- POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )
题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...
- Settings点击Location(位置)后右上角的开关button不会消失
MT8121/8382平台: 前几天又遇到一个源码的bug.在10寸平板上,进入设置界面,点击Location(位置)项,右上角Title处会显示一个开关button,用来开关定位服务.但点完Loca ...
- String类的常见方法的使用案例
String类的常见方法的使用案例 //使用指定的字符串替换当前字符串中指定的内容 //将helloworld中的o替换为a String s="HelloWorld"; Stri ...
- 1.flume概述
我们的web服务器等等每天会产生大量的日志,我们要把这些日志收集起来,移动到hadoop平台上进行分析. 那么如何移动这些数据呢?一种方法是通过shell cp到hadoop集群上,然后通过hdfs ...
- k8s job的使用
1.运行一次性容器 容器按照持续运行的时间可分为两类: 服务类容器 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等. 工作类容器 工作类容器则是一次性任务,比 ...
- w3cschool javascript学习
name与Id属性区别 1.我们知道在网页做Post提交时,是以Form(即表单域)为单位进行提交的,一个Form里有若干个表单对象(如<input type="text" ...
- Laravel5.5配置使用redis
1.安装redis linux上redis的安装与配置 2.安装redis客户端 composer require predis/predis或者安装 PhpRedis PHP 扩展brew inst ...