【分块】【树状数组】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 ...
随机推荐
- linux bash善用判断式
1.利用 test 指令的测试功能 $ test -e hello.sh && echo "ok" || echo "no" ok 2.首先,判 ...
- python爬取七星彩的开奖历史记录
1.因为人不可能一直无休止的学习,偶尔也想做点儿别的,昨天无聊就想写写Python,当然我承认我上班后基本都是在学工作方面的事情,在这个岗位我也呆了三年多了,还是那句话问我什么会不会我会给你说我啥都会 ...
- 桥接物理网卡,pipwork指定ip,外网连接,研究salt+docker
1.桥接物理网卡: 首先下载工具: yum -y install --enablerepo=epel bridge-utils 停止服务: 983 systemctl stop docker 删除do ...
- JS学习笔记之页面信息滚动效果
效果截图: 1.无缝滚动效果 JS代码: <script> window.onload=function(){ var oInfobox=document.getElementById(' ...
- php CI框架基础知识
一. CI框架的MVC导图 二. CI框架目录文件介绍 (1)index.php 单入口 整个框架对外暴露的唯一访问文件 (2)application 应用文件(放置用户信息,用户 ...
- .NET之特性和属性(转)
1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...
- 【洛谷 P1445】 [Violet]樱花(唯一分解定理)
做了题还是忍不住要写一发题解,感觉楼下的不易懂啊. 本题解使用latex纯手写精心打造. 题意:求\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\)的正整数解总数. 首先 ...
- bzoj 1834
网络流的模板题 首先第一问我们直接用dinic搞就行了,费用直接存为0(时间上界非常松,这道题是能过),然后第二问我们只需要在第一问 的残余网络上加一个源点,源点指向1号点,容量为k,费用为0,然后对 ...
- 10款最新CSS3/jQuery菜单导航插件
这是我们在2014年收集的10款最新的CSS3 / jQuery菜单导航插件,不论从外观样式,还是功能扩展性,这些jQuery菜单一定可以满足大家的设计需求.这次我们收集的jQuery菜单,有水平 菜 ...
- Linux设置编译器环境变量
Linux设置编译器环境变量 https://jingyan.baidu.com/article/9f7e7ec0bb22aa6f29155453.html Linux添加环境变量与GCC编译器添加I ...