题面传送门

题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线

很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献,而这道题是用可持久化线段树罢了

首先对序列分块,设块大小为$S$

再建出主席树,我们就能在$O(logn)$时间内查询某个点$i$与区间$[l,r]$内的点产生的逆序对数量

然后处理出点和整块之间的答案,设$f(i,j)$表示第$i$个点与第$j$块的开始/末尾这段区间内的点产生的逆序对数量。

再根据 点到块的答案 统计出 块到块的答案

对于每次询问,利用预处理出的东西$O(1)$搞出 整块到整块 的贡献,再暴力枚举边角+主席树查询搞出 边角到整块 和 边角到边角 的贡献。

然后就会被卡常

我们可以用树状数组搞出 边角到边角 的贡献,再用预处理的信息搞出 边角对整块 的贡献...

虽然每次查询的时间也是$O(logn)$不变,但非递归的树状数组确实能减少大量的常数 #喷血

分析一下时间复杂度,预处理+查询=O(n\frac{n}{S}logn+QSlogn),因为预处理是用主席树查询的所以比较慢..块要开大一些

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 50500
#define M1 120
#define ll long long
#define uint unsigned int
using namespace std; template <typename _T> void read(_T &ret)
{
ret=; _T fh=; char c=getchar();
while(c<''||c>''){ if(c=='-') fh=-; c=getchar(); }
while(c>=''&&c<=''){ ret=ret*+c-''; c=getchar(); }
ret=ret*fh;
} struct SEG{
int ls[N1*],rs[N1*],sz[N1*],root[N1],tot;
void pushup(int rt){ sz[rt]=sz[ls[rt]]+sz[rs[rt]]; }
void upd(int x,int l,int r,int rt1,int &rt2,int w)
{
if(!rt2||rt1==rt2){ rt2=++tot; ls[rt2]=ls[rt1]; rs[rt2]=rs[rt1]; sz[rt2]=sz[rt1]; }
if(l==r){ sz[rt2]+=w; return; }
int mid=(l+r)>>;
if(x<=mid) upd(x,l,mid,ls[rt1],ls[rt2],w);
else upd(x,mid+,r,rs[rt1],rs[rt2],w);
pushup(rt2);
}
int query(int L,int R,int l,int r,int rt1,int rt2)
{
if(L<=l&&r<=R) return sz[rt2]-sz[rt1];
int mid=(l+r)>>,ans=;
if(L<=mid) ans+=query(L,R,l,mid,ls[rt1],ls[rt2]);
if(R>mid) ans+=query(L,R,mid+,r,rs[rt1],rs[rt2]);
return ans;
}
}s; int n,m,sq,Q,de; struct BIT{
int sum[N1];
int upd(int x,int w)
{
int i;
for(i=x;i<=m;i+=(i&(-i)))
sum[i]+=w;
}
int query(int x)
{
if(!x) return ; int i,ans=;
for(i=x;i>;i-=(i&(-i)))
ans+=sum[i];
return ans;
}
}bit; int a[N1],b[N1],pie[N1],st[M1],ed[M1];
uint f[N1][M1],g[M1][M1]; int main()
{
int i,j,k,l,r,q,x,y,px,py; uint ans=;
scanf("%d",&n);
for(i=;i<=n;i++) read(a[i]), b[i]=a[i];
sort(b+,b+n+); m=unique(b+,b+n+)-(b+);
for(i=;i<=n;i++) a[i]=lower_bound(b+,b+m+,a[i])-b;
for(i=;i<=n;i++) s.upd(a[i],,m,s.root[i-],s.root[i],); sq=;
for(i=;i<=n;i++) pie[i]=(i-)/sq+, ed[pie[i]]=i;
for(i=;i<=pie[n];i++) st[i]=(i-)*sq+;
for(i=;i<=n;i++)
{
if(a[i]<m)
{
for(j=;j<pie[i];j++)
f[i][j]=s.query(a[i]+,m,,m,s.root[st[j]-],s.root[i-]);
f[i][]=s.query(a[i]+,m,,m,s.root[st[pie[i]]-],s.root[i-]);
}
if(a[i]>)
{
for(j=pie[i];j<=pie[n];j++)
{
f[i][j]=s.query(,a[i]-,,m,s.root[i],s.root[ed[j]]);
g[pie[i]][j]+=f[i][j];
}
}
}
for(j=;j<=pie[n];j++)
for(i=;i+j<=pie[n];i++)
g[i][i+j]+=g[i+][i+j]; scanf("%d",&Q);
for(q=;q<=Q;q++)
{
read(x); read(y); x^=ans; y^=ans; ans=; px=pie[x]; py=pie[y];
if(px!=py){
if(px+<=py-) ans=g[px+][py-];
for(i=x;i<=ed[px];i++) ans+=f[i][py-];
if(px+==py){
for(i=st[py];i<=y;i++) ans+=f[i][];
}else{
for(i=st[py];i<=y;i++) ans+=f[i][px+];
}
for(i=st[py];i<=y;i++) bit.upd(a[i],);
for(i=x;i<=ed[px];i++) if(a[i]>) ans+=bit.query(a[i]-);
for(i=st[py];i<=y;i++) bit.upd(a[i],-);
}else{
for(i=y;i>=x;i--)
{
if(a[i]>) ans+=bit.query(a[i]-);
bit.upd(a[i],);
}
for(i=x;i<=y;i++) bit.upd(a[i],-);
}
printf("%u\n",ans);
}
return ;
}

BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)的更多相关文章

  1. BZOJ 3744 Gty的妹子序列 (分块 + BIT)

    3744: Gty的妹子序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1931  Solved: 570[Submit][Status][Dis ...

  2. BZOJ 3744: Gty的妹子序列 [分块]

    传送门 题意:询问区间内逆序对数 感觉这种题都成套路题了 两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个 f我直接处理成到元素j,方便一点 用个树状数 ...

  3. BZOJ 3744 Gty的妹子序列 分块+树状数组

    具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nn​logn) CODE #include <cmath> #include <cctyp ...

  4. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  5. BZOJ 3744 Gty的妹子序列 做法集结

    我只会O(nnlogn)O(n\sqrt nlogn)O(nn​logn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nn​logn) 搬来 ...

  6. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  7. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

  8. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  9. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

随机推荐

  1. Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例

    今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...

  2. 权限问题导致无法删除ftp文件

    首先吐槽一下,使用新版编辑器,发了两遍愣是time out,果断放弃 这个文章也是一件小事,大致说一下: 有一个java操作ftp文件的程序,运行删除时,总是返回false,也没有报错.開始考虑是没有 ...

  3. 【SDOI2008】【BZOJ2049】Cave 洞穴勘測

    Description 辉辉热衷于洞穴勘測.某天,他依照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘測,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成.而且每条通道连接了恰好 ...

  4. B1789 Y型项链 贪心

    想明白之后就是一道大水题,就是两两把最长公共前缀求出来,然后直接取最长的,然后就直接暴力算就行了... 题干: Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在 ...

  5. bzoj4034 [HAOI2015]树上操作——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4034 树剖裸题: 一定要注意 long long !!! update 的时候别忘了 pus ...

  6. Java-JDK:JDK百科

    ylbtech-Java-JDK:JDK百科 JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(J ...

  7. MSSQL服务器 电脑改名后配置

    原服务器名改为新的名字后,系统配置更新 select * from sys.sysserversexec sp_dropserver 'WIN-JVU5CSOLEPL'exec sp_addserve ...

  8. EasyUI TreeGrid 悬浮效果

    /* 鼠标悬停扩展*/ (function (hasgrid) { if (hasgrid) { /** * 表格提示 */ $.extend($.fn.datagrid.methods, { too ...

  9. JNI学习积累之一 ---- 常用函数大全

    主要资料来源: 百度文库的<JNI常用函数> . 同时对其加以了补充 . 要素  :1. 该函数大全是基于C语言方式的,对于C++方式可以直接转换 ,例如,对于生成一个jstring类型的 ...

  10. Web Api跨域登录问题

    最近项目第一次尝试使用web api,照搬了一般mvc的Forms登录方式,在和前端对接的时候出现一个问题: 前端使用ajax调用登录接口完成登录后,再调用别的接口,被判断为未登录. 如果直接在浏览器 ...