【分块】【树状数组】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 ...
随机推荐
- 设置edittext的样式
1.在res->drawable编写 <?xml version="1.0" encoding="utf-8"?> <shape xml ...
- [05] css优先级
1.优先级计算规则(特殊性) 在css中,有不同的方式编写css,如果想给同一个标签设置样式,选择器的写法有很多种,那么当多个样式都应用于同一个标签,标签优先选择哪个样式呢?按照以下规则: 现有 0, ...
- svn“Previous operation has not finished; run 'cleanup' if it was interrupted“ 或者不能cleanup,或者提示空目录 报错的解决方法
参考了文档: http://blog.csdn.net/superch0054/article/details/38668017 今天碰到了个郁闷的问题,svn执行clean up命令时报错“Prev ...
- 【BZOJ3029】守卫者的挑战 [期望DP]
守卫者的挑战 Time Limit: 2 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 打开了黑魔法师Vani的大门,队 ...
- 关于k Line Chart (k线图)
K Line Chart python实现k线图的代码,之前找过matplotlib中文文档但是画k线图的finance方法已经弃用了.所以自己在网上搜寻一下加上改编,很好的实现出k线图, 代码如下: ...
- Oracle 脚本记录
给表创建序列或触发器 create or replace procedure p_createseq(tablename in varchar2,key in varchar2) Authid Cur ...
- Spring MVC的静态和动态概念
MVC模式: 图释:用户请求通过HTTP协议到达Front controller,Front controller把请求送给Controller,Controller了解业务逻辑细节并且调用业务逻辑数 ...
- 【bzoj3924&&luogu3345】幻想乡战略游戏
这题可以用线段树做,不过正解恐怕是动态点分治?(点分树) 简单介绍下动态点分治的概念:在点分治的过程中,一般我们面对的问题都是静态的.如果涉及到修改这类的操作,我们就希望找到我们是如何处理到当前的修改 ...
- tarjan算法和Kosaraju算法
tarjan算法和Kosaraju算法是求有向图的强连通分量的算法: #include<iostream> #include<cstring> using namespace ...
- 安装并启用rabbitmq服务器
1.确保Erlang已经安装 2.安装rabbitmq服务器 [root@bogon yum.repos.d]# rpm --import https://dl.bintray.com/rabbitm ...