莫队维护逆序对,区间左右增减要分类讨论。

记得离散化。

 /**************************************************************
Problem: 3289
User: idy002
Language: C++
Result: Accepted
Time:5480 ms
Memory:3164 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 50010
#define lowbit(i) ((i)&(-(i)))
using namespace std; typedef long long lng; int n, m;
int disc[maxn];
int lx[maxn], rx[maxn], mccno[maxn], stot;
int w[maxn];
lng cnt[maxn], cnttot, cur_ans;
lng ans[maxn]; struct Qu {
int l, r, id;
bool operator<( const Qu & b ) const {
return mccno[l]<mccno[b.l] || (mccno[l]==mccno[b.l] && r<b.r );
}
};
Qu qu[maxn]; lng qu_pres( int r ) {
lng rt = ;
for( int i=r; i; i-=lowbit(i) )
rt += cnt[i];
return rt;
}
void up_val( int pos, int delta ) {
for( int i=pos; i<=n; i+=lowbit(i) )
cnt[i] += delta;
cnttot += delta;
}
void push_back( int pos ) {
cur_ans += cnttot - qu_pres( pos );
up_val( pos, + );
}
void pop_back( int pos ) {
cur_ans -= cnttot - qu_pres( pos );
up_val( pos, - );
}
void push_front( int pos ) {
cur_ans += qu_pres( pos- );
up_val( pos, + );
}
void pop_front( int pos ) {
cur_ans -= qu_pres( pos- );
up_val( pos, - );
} void partition() {
int len = (int)ceil(sqrt(n))+;
int stot = n/len;
rx[] = ;
for( int i=; i<=stot; i++ ) {
lx[i] = rx[i-]+;
rx[i] = rx[i-]+len;
}
if( rx[stot]!=n ) {
stot++;
lx[stot] = rx[stot-]+;
rx[stot] = n;
}
for( int i=; i<=stot; i++ )
for( int j=lx[i]; j<=rx[i]; j++ )
mccno[j] = i;
}
void work() {
sort( qu+, qu++m );
int lf, rg;
for( int q=; q<=m; q++ ) {
if( q== || mccno[qu[q].l] != mccno[qu[q-].l] ) {
lf = qu[q].l;
rg = qu[q].l-;
memset( cnt, , sizeof(cnt) );
cur_ans = cnttot = ;
}
while( lf<qu[q].l ) pop_front( w[lf++] );
while( lf>qu[q].l ) push_front( w[--lf] );
while( rg<qu[q].r ) push_back( w[++rg] );
while( rg>qu[q].r ) pop_back( w[rg--] );
ans[qu[q].id] = cur_ans;
}
}
int main() {
scanf( "%d", &n );
for( int i=; i<=n; i++ ) {
scanf( "%d", w+i );
disc[i] = w[i];
}
sort( disc+, disc++n );
for( int i=; i<=n; i++ )
w[i] = lower_bound( disc+, disc++n, w[i] ) - disc;
scanf( "%d", &m );
for( int i=; i<=m; i++ ) {
scanf( "%d%d", &qu[i].l, &qu[i].r );
qu[i].id = i;
}
partition();
work();
for( int i=; i<=m; i++ )
printf( "%lld\n", ans[i] );
}

bzoj 3289 莫队 逆序对的更多相关文章

  1. 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  2. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  3. BZOJ 3339 & 莫队+"所谓的暴力"

    题意: 给一段数字序列,求一段区间内未出现的最小自然数. SOL: 框架显然用莫队.因为它兹瓷离线. 然而在统计上我打了线段树...用&维护的结点...400w的线段树...然后二分查找... ...

  4. 【BZOJ 3295】动态逆序对 - 分块+树状数组

    题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...

  5. bzoj 2038 莫队算法

    莫队算法,具体的可以看10年莫涛的论文. 大题思路就是假设对于区间l,r我们有了一个答案,那么对于区间l,r+1,我们 可以暴力的转移一个答案,那么对于区间l1,r1和区间l2,r2,需要暴力处理 的 ...

  6. bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...

  7. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

  8. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  9. Bzoj 2141: 排队 分块,逆序对,树状数组

    2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1310  Solved: 517[Submit][Status][Discuss] D ...

随机推荐

  1. mysql-connector-python取二进制字节时报错UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 0

    在储存用户密码时,我使用了hmac算法对用户密码加密,加密出来的hash值是一个二进制字节串,我把这个字节串存到mysql的password字段,password字段的数据类型是varbinary. ...

  2. 24、简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  3. 如何在移动端app中应用字体图标icon fonts

    How to use icon fonts in your mobile apps 在任何APP设计中实现可图形的矢量缩放最完美的方式是使用字体图标. 移动端的设计变的越来越复杂.原因在于多样的屏幕尺 ...

  4. Mysql储存过程1: 设置结束符与储存过程创建

    #显示储存过程 show procedure status; #设置结束符 delimiter $; #创建储存过程 create procedure procedure_name() begin - ...

  5. 关于text-decoration无法清除继承的问题

    因为text-decoration的值可以叠加,所以即使设置了none,浏览器也是看成是叠加,而不是清除的意思.

  6. sicily 1259. Sum of Consecutive Primes

    Description Some positive integers can be represented by a sum of one or more consecutive prime numb ...

  7. xshell连接Ubuntu虚拟机

    Ubuntu系统 1,安装ssh sudo apt-get install openssh-server 2,启动ssh进程 /etc/init.d/ssh start 3,查看进程信息 ps -e ...

  8. supervisor 的使用

    1.通过yum安装 supervisor: 2.supervisorctl 查看状态: 3.supervisor.d 下查看配置文件,修改命令和日志目录 4.tail -f /var/log/supe ...

  9. ioctl socket getsockopt

    一 ioctl 函数产生原因: 虽然在文件操作结构体"struct file_operations"中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数.如CD-RO ...

  10. Python静态代码检查工具Flake8

    简介 Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,相对于目前热度比较高的Pylint来说,Flake8检查规则灵活,支持集成额外插件,扩展性强.Flake8是对 ...