BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门: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
Input
Output
对每个询问,单独输出一行,表示al...ar中的逆序对数。
Sample Input
1 4 2 3
1
2 4
Sample Output
解题思路:
如果是可以离线的话,直接莫队啦。
但是这里强制在线,就需要分块了。
用 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的妹子序列 【分块 + 树状数组 + 主席树】的更多相关文章
- BZOJ 3744 Gty的妹子序列 (分块 + BIT)
3744: Gty的妹子序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1931 Solved: 570[Submit][Status][Dis ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- BZOJ 3744: Gty的妹子序列 [分块]
传送门 题意:询问区间内逆序对数 感觉这种题都成套路题了 两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个 f我直接处理成到元素j,方便一点 用个树状数 ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- BZOJ 3744 Gty的妹子序列 做法集结
我只会O(nnlogn)O(n\sqrt nlogn)O(nnlogn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nnlogn) 搬来 ...
- P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...
- zoj2112 树状数组+主席树 区间动第k大
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
随机推荐
- PostgreSQL Entity Framework 自动迁移
1.依次添加NuGet包 EntityFramework.Npgsql.EntityFramework6.Npgsql,会自动生成一些配置文件,不过缺少数据库驱动的配置节点: <system.d ...
- 2.Windows服务-->安装卸载服务
1.使用vs组件“VS2012开发人员命令提示” 工具,进行安装卸载服务(必须以“管理员身份运行") 安装和卸载的时候选择合适的安装程序工具地址,例如: 安装服务:C:\Windows\Mi ...
- 【3】.net MVC 使用IPrincipal进行Form登录即权限验证
1.在MVC项目中添加用户类,可以根据实际项目需求添加必要属性 public class UserData { /// <summary> /// ID /// </summary& ...
- Java API 之 动态代理
一.代理模式 如图:由于某些原因我们希望对该实现类进行访问控制.功能增强等,那么加入一层代理层,用代理层来调用实现类是一个很好的方式来解决这个问题,我们可以在调用实现类功能前后进行校验或者加入一些功能 ...
- IntelliJ IDEA 快捷键(一)(window版)
一.高效定位代码 1.跳转 1.项目之间的跳转 Next Project Window 快捷键 Ctrl + Alt + 左方括号. Previous Project Window 快捷键 Ctrl ...
- javaweb带属性的自定义标签
带属性的自定义标签: 1.先在标签处理器中定义setter方法,建议把所有的属性类型都设置为String类型. package com.javaweb.tag; import java.io.IOEx ...
- centos自带python2.6升级到python2.7。并解决yum pip easy_install pip等模块兼容性问题
参考原文: https://www.cnblogs.com/kimyeee/p/7250560.html https://www.cnblogs.com/galaxy-gao/p/5796488 ...
- ECMA6所有知识点大概笔记
ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现 初学者一开始学习JavaScript,其实就是在学3.0版的语法. -------------------- ...
- crontab 切割日志
cutlog.sh #!/bin/sh source /etc/profile D=$(date "+%Y%m%d%H%M%S") mv "/usr/local/Cell ...
- 移动端适配(3)——rem适配
rem适配 <meta name="viewport" content="width=device-width,user-scalable=no"/&g ...