任意门: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. 开窗函数over()

    使用方法 如:select name,avg(shengao)from xinxi group by name //我们都知道使用聚合函数要使用分组,如果不分组怎么办 Selct name,avg(s ...

  2. JavaScript对象中的constructor属性

    constructor属性始终指向创建当前对象的构造函数. 比如下面的例子: // 等价于 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, ...

  3. Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...

  4. 简单测试Java线程安全中阻塞同步与非阻塞同步性能

    摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...

  5. 网站SEO优化

    网站的优化应该迎合搜索引擎,这样才能得到事半功倍的效果! 一.站内优化 1.做好HTML头标签 标题(title):标题是网页优化中相当有分量,一般网页title主要包含一些关键词.网站名称等.关键词 ...

  6. sql:查询创建表的结构

    --显示所有用户表: --1 SELECT SCHEMA_NAME(schema_id) As SchemaName , name As TableName from sys.tables ORDER ...

  7. javascript获取文件后缀名

    javascript获取文件后缀名:在需要验证文件格式的时候,首先就要获得文件的格式,下面是一个通过正则表达式获取文件后缀名的一个简单实例. function validate(){ var impo ...

  8. Android setTag()/getTag()

    View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来. 可以用在多个Button添加一个监听器,每个Button都设置不同的setTag ...

  9. metasploit 连接database相关问题

    我们首先去这个目录下看database.yml文件内容: 下图是我们看到的的信息 接着打开metasploit,运行db_connect 指令链接数据库.格式为: db_connect 用户名:密码@ ...

  10. 调用Linux的busybox,通过linux命令来获取AndRoidIP

    //根据busybox获取本地Mac public static String getLocalMacAddressFromBusybox(){ String result = "" ...