bzoj 3744: Gty的妹子序列 主席树+分块
3744: Gty的妹子序列
Time Limit: 15 Sec Memory Limit: 128 MB
Submit: 101 Solved: 34
[Submit][Status]
Description
Input
Output
对每个询问,单独输出一行,表示al...ar中的逆序对数。
Sample Input
1 4 2 3
1
2 4
Sample Output
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define MAXN 50010
#define MAXT 3200000
#define MAXB1 240
#define INF 0x3f3f3f3f
int n,m;
struct sgt_node
{
int lch,rch;
int t;
}sgt[MAXT];
int topt=;
void Add_sgt(int &now,int base,int l,int r,int pos)
{
now=++topt;
sgt[now]=sgt[base];
sgt[now].t++;
if (l==r)return ;
if (pos<=((l+r)>>))
Add_sgt(sgt[now].lch,sgt[base].lch,l,(l+r)>>,pos);
else
Add_sgt(sgt[now].rch,sgt[base].rch,((l+r)>>)+,r,pos);
}
int Qry_sgt(int now1,int now2,int l,int r,int x,int y)
{
if (!now1 && !now2)return ;
if (l==x && r==y)
return sgt[now1].t-sgt[now2].t;
int mid=(l+r)>>;
if (y<=mid)
return Qry_sgt(sgt[now1].lch,sgt[now2].lch,l,mid,x,y);
else if (mid<x)
return Qry_sgt(sgt[now1].rch,sgt[now2].rch,mid+,r,x,y);
else
return Qry_sgt(sgt[now1].lch,sgt[now2].lch,l,mid,x,mid)
+ Qry_sgt(sgt[now1].rch,sgt[now2].rch,mid+,r,mid+,y);
}
int roof[MAXN];
int Qry_tot(int rl,int rr,int x,int y)
{
return Qry_sgt(roof[rr],roof[rl-],,m,x,y);
} int num[MAXN];
int bs[MAXB1],bt[MAXB1];
int bres1[MAXB1][MAXN];
struct aaa
{
int pos,val;
}a[MAXN];
bool cmp_pos(aaa a1,aaa a2)
{
return a1.pos<a2.pos;
}
bool cmp_val(aaa a1,aaa a2)
{
return a1.val<a2.val;
}
int tarr[MAXN];
void Add_val(int pos)
{
while (pos<MAXN)
{
tarr[pos]++;
pos+=pos&(-pos);
}
}
int Qry_sum(int pos)
{
int ret=;
while (pos)
{
ret+=tarr[pos];
pos-=pos&(-pos);
}
return ret;
}
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
scanf("%d",&n);
int i,j,k;
int x,y,z;
for (i=;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].pos=i;
}
sort(a+,a+n+,cmp_val);
m=;
for (i=;i<=n;i++)
{
if (i== || a[i].val!=x)
{
x=a[i].val;
a[i].val=++m;
}else
{
a[i].val=m;
}
}
sort(a+,a+n+,cmp_pos);
for (i=;i<=n;i++)
num[i]=a[i].val;
int sb=(int)sqrt(n);
if (sb>n)sb=n;
for (i=;i<=n;i++)
{
Add_sgt(roof[i],roof[i-],,m,num[i]);
}
memset(bs,INF,sizeof(bs));
memset(bt,,sizeof(bt));
for (i=;i<=n;i++)
{
bs[i/sb]=min(bs[i/sb],i);
bt[i/sb]=max(bt[i/sb],i);
}
int tp=n/sb;
int res=;
for (i=;i<=tp;i++)
{
memset(tarr,,sizeof(tarr));
for (j=bs[i];j<=n;j++)
{
bres1[i][j]=bres1[i][j-]+j-bs[i]-Qry_sum(num[j]);
Add_val(num[j]);
}
}
int q;
scanf("%d",&q);
res=;
int t;
for (i=;i<q;i++)
{
scanf("%d%d",&x,&y);
x^=res;y^=res;
if (abs(x/sb - y/sb)<=)
{
res=;
for (j=x+;j<=y;j++)
{
res+=Qry_tot(x,j-,num[j]+,m);
}
printf("%d\n",res);
}else
{
res=bres1[x/sb+][y];
for (j=x;j<=bt[x/sb];j++)
{
res+=Qry_tot(j+,y,,num[j]-);
}
printf("%d\n",res);
}
}
}
bzoj 3744: Gty的妹子序列 主席树+分块的更多相关文章
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
- 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的妹子序列
Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...
- BZOJ 3744 Gty的妹子序列 做法集结
我只会O(nnlogn)O(n\sqrt nlogn)O(nnlogn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nnlogn) 搬来 ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
- bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...
- BZOJ 3744: Gty的妹子序列 [分块]
传送门 题意:询问区间内逆序对数 感觉这种题都成套路题了 两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个 f我直接处理成到元素j,方便一点 用个树状数 ...
- BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)
题目链接 静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于 ...
随机推荐
- careercup-链表 2.5
2.5 给定两个用链表表示的整数,每个结点包含一个数位.这些数位是反向存放的,也就是个位排在链表首部.编写函数对这两个整数求和,并用链表形式返回结果. 示例: 输入: (7->1->6)+ ...
- PureMVC(JS版)源码解析(七):Mediator类
之前的博文中,我们分析了SimpleCommand类和MacroCommand类,这两个类用作"业务逻辑(business logic)"处理,今天,我们讲一些和UI界面相关联的M ...
- python学习笔记--导入tab键自动补全功能的配置
今天开始学习Python,必须配置tab键补全功能 1.首先我们需要查看python的安装路径 [root@abc ~]# python Python 2.6.6 (r266:84292, Jan 2 ...
- LAMP环境部署总结
linux+apche+mysql+php 此次用到的工具有:/etc/init.d/iptables , selinux, useradd, yum,chkconfig,sshd,visudo,cr ...
- android使用属性动画代替补间动画
本文参考Android属性动画完全解析(上),初识属性动画的基本用法 android3.0之前一共有两种动画,分别是frame动画和tween动画,关于这两种动画如果不了解可以查看我之前的文章andr ...
- oracle修改登录认证方式
通过配置sqlnet.ora文件,我们可以修改oracle登录认证方式. SQLNET.AUTHENTICATION_SERVICES=(NTS);基于操作系统的认证 SQLNET.AUTHENTIC ...
- MKServerBuilder.psm1
MKServerBuilder.psm1 function Test-ElevatedShell { $user = [Security.Principal.WindowsIdentity]::Get ...
- java web 中的转发和重定向
假设应用程序的 contextPath 为 /ctx,在 http://localhost:8080/ctx/a/b 资源中,我们转发和重定向到 http://localhost:8080/ctx/x ...
- C#中堆和栈的区别分析(有待更新总结)
转载:http://blog.csdn.net/zevin/article/details/5721495 一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区 ...
- sql sever怎样替换把表中数据。
怎样替换把表中“舞台桁架厂”替换为“舞台桁架厂家” 表数据结构为: id name key addre ...