任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744

3744: Gty的妹子序列

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 2571  Solved: 746
[Submit][Status][Discuss]

Description

我早已习惯你不在身边,
 
人间四月天 寂寞断了弦。
 
回望身后蓝天,
 
跟再见说再见……
 
 
某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现
 
她们排成了一个序列,每个妹子有一个美丽度。
 
Bakser神犇与他打算研究一下这个妹子序列,于是Bakser神犇问道:"你知道区间
 
[l,r]中妹子们美丽度的逆序对数吗?"
 
蒟蒻Autumn只会离线乱搞啊……但是Bakser神犇说道:"强制在线。"
 
请你帮助一下Autumn吧。
 
 
给定一个正整数序列a,对于每次询问,输出al...ar中的逆序对数,强制在线。

Input

第一行包括一个整数n(1<=n<=50000),表示数列a中的元素数。
 
第二行包括n个整数a1...an(ai>0,保证ai在int内)。
 
接下来一行包括一个整数m(1<=m<=50000),表示询问的个数。
 
接下来m行,每行包括2个整数l、r(1<=l<=r<=n),表示询问al...ar中的逆序
 
对数(若ai>aj且i<j,则为一个逆序对)。
 
l,r要分别异或上一次询问的答案(lastans),最开始时lastans=0。
 
保证涉及的所有数在int内。

Output

对每个询问,单独输出一行,表示al...ar中的逆序对数。

Sample Input

4
1 4 2 3
1
2 4

Sample Output

2

解题思路:

如果是可以离线的话,直接莫队啦。

但是这里强制在线,就需要分块了。

用 f [ j ][ i ] 维护 第 j 到 第 i 块的右端的答案,这样就省去了 处理块前的那些情况了(论前缀和的美妙)。

预处理 f[ j ][ i ] 的方法就是树状数组直接暴力。

如果 当前区间 【L,R】的 R刚好是某一块的右端点,那么 答案 就是 f [ L ][ pos[ R ] ];

如果不是,那么我们还要处理一下 R 到 前一块右端点的 区间 逆序数,

这里分两部分,第一部分是这一区间与前面的的逆序数,用主席树维护。

       第二部分就是这一区间的逆序数了,直接树状数组暴力。

AC code:

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = 5e4+;
int N, M, cnt, tot, ans;
int c1[MAXN], c2[MAXN];
int ch[MAXN*][], sum[MAXN*], a[MAXN], d[MAXN];
int siz, lim, bl[], br[], pos[MAXN];
int f[MAXN][], root[MAXN]; void add1(int x, int val) //维护小的值
{
while(x <= N){
c1[x]+=val;
x+=(x&(-x));
}
} void add2(int x, int val) //维护大的值
{
while(x){
c2[x]+=val;
x-=(x&(-x));
}
} int query1(int x)
{
int res = ;
while(x){
res+=c1[x];
x-=(x&(-x));
}
return res;
} int query2(int x)
{
int res = ;
while(x <= N){
res+=c2[x];
x+=(x&(-x));
}
return res;
} void update(int x, int &y, int l, int r, int k)
{
y = ++tot;
ch[y][] = ch[x][];
ch[y][] = ch[x][];
sum[y] = sum[x]+;
if(l==r) return;
int mid = (l+r)/;
if(k<=mid) update(ch[x][], ch[y][], l, mid, k);
else update(ch[x][], ch[y][], mid+, r, k);
} int getsum(int x, int y, int l, int r, int L, int R)
{
if(L > R) return ;
if(l >= L && r <= R) return sum[y]-sum[x];
int mid = (l+r)/, res = ;
if(L <= mid) res+=getsum(ch[x][], ch[y][], l, mid, L, R);
if(R > mid) res+=getsum(ch[x][], ch[y][], mid+, r, L, R);
return res;
} int main()
{
int i, j, x, L, R;
scanf("%d", &N);
for(int i = ; i <= N; i++){
scanf("%d", &a[i]);
d[i] = a[i];
}
sort(d+, d++N);
siz = unique(d+, d++N)-d-;
for(i = ; i <= N; i++)
a[i] = lower_bound(d+, d++siz, a[i])-d; lim = sqrt(N);
for(i = ; i <= N; i+=lim){
bl[++cnt] = i;br[cnt] = min(N, i+lim-);
for(j = bl[cnt]; j <= br[cnt]; j++)
pos[j] = cnt;
} for(i = ; i <= cnt; i++){
add1(a[br[i]], );
for(j = br[i]-; j >= ; j--){
f[j][i] = f[j+][i]+query1(a[j]-);
add1(a[j], );
}
for(j = br[i]; j >= ; j--){
add1(a[j], -);
}
} for(i = ; i <= N; i++)
update(root[i-], root[i], , N, a[i]); scanf("%d", &M);
ans = ;
while(M--){
scanf("%d %d", &L, &R);
L^=ans;R^=ans;
ans = ;
if(L > R) {puts(""); continue;}
if(pos[L] == pos[R]){
for(j = L; j <= R; j++){
ans+=query2(a[j]+);
add2(a[j], );
}
for(j = L; j <= R; j++)
add2(a[j], -);
}
else{
if(br[pos[R]] == R){
ans = f[L][pos[R]];
}
else{
ans = f[L][pos[R]-];
x = br[pos[R]-];
if(x){
for(j = x+; j <= R; j++){
ans+= getsum(root[L-], root[x], , N, a[j]+, N);
}
for(j = x+; j <= R; j++){
ans+=query2(a[j]+);
add2(a[j],);
}
for(j = x+; j <= R; j++)
add2(a[j], -);
}
}
}
printf("%d\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的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. php对图片加水印--将一张图片作为水印加到另一张图片

    代码如下: /**  * 图片加水印(适用于png/jpg/gif格式)  *  * @param $srcImg  原图片  * @param $waterImg 水印图片  * @param $s ...

  2. 数据结构(四)--- 红黑树(RedBlock-Tree)

      文章图片来自邓俊辉老师课件 先提几个问题去思考学习本文 : 红黑树和2-4树(B-Tree)很像,那么它存在的动机又是什么呢 插入和删除操作的逻辑又是怎么样的,时间和空间复杂度可以达到怎么样 和 ...

  3. post方式发送接收文件

    //文件post发送 var express = require('express');var router = express.Router();var request = require(&quo ...

  4. 初进JAVA职场面试小技巧:一个老学长的吐血之作!

    看着一批批小白的遭遇,有些无奈,又跟我年轻时有些类似.今天正好有点时间,给你几个建议. 1.在结业之前一定要把自己参与过的项目仔细审视一下,一点要特别熟悉项目的流程功能,另外也要重视自己做过的模块,看 ...

  5. zookeeper【2】集群管理

    Zookeeper 的核心是广播,这个机制保证了各个Server之间的同步.实现这个机制的协议叫做Zab协议. Zab协议有两种模式,它们分别是恢复模式(选主)和广播 模式(同步).当服务启动或者在领 ...

  6. POJ 1185 炮兵阵地 经典的 状态压缩dp

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16619   Accepted: 6325 Description ...

  7. jxls实现动态图表

    此文章是基于 jxls实现基于excel模板的报表 一. 制作excel动态图表模板 1. 安装 excel 2003 ,新建文件,命名为:runRecord.xls 2. 创建两个表格,分别命名为: ...

  8. 初识shell expect

    场景:工作中经常会遇到shell脚本写的连接脚本,所以稍微了解下. 一.shell Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言 ...

  9. php扩展库

    php调用C/C++动态链接库 字数997 阅读28 评论0 喜欢0 本人最近在找实习,移动开发方向.有意者可直接与本人联系.谢谢! 一.简介 一般而言,php速度已经比较快,但是,对于一些较高级开发 ...

  10. Android通过浏览器打开app页面并且传递值

    最近公司有个需求,要求从第三方网页端打开一个网页,然后在网页中点击“下载”,“打开”按钮,在app端进行下载和打开操作.这里记录下方法. 首先,网页和app页面进行交互,其实会很快想到JS交互,但是现 ...