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

记得离散化。

 /**************************************************************
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. bzoj 1143 二分图最大独立集

    我们可以将一个点拆成两个点x,y,那么如果存在一条i->j的路径,我们就连接xi,yj,那么答案就是n-最大匹配数. 因为i->j所以对于i与j只能选一个,那么我们只需要求出来二分图的最大 ...

  2. SVM支持向量机的基本原理

    SVM支持向量机的基本原理 对于很多分类问题,例如最简单的,一个平面上的两类不同的点,如何将它用一条直线分开?在平面上我们可能无法实现,但是如果通过某种映射,将这些点映射到其它空间(比如说球面上等), ...

  3. CRF++模板使用(转)

    CRF++模板构建分为两类,一类是Unigram标注,一类是Bigram标注. Unigram和Bigram模板分别生成CRF的状态特征函数  和转移特征函数  .其中  是标签,  是观测序列,   ...

  4. Python3 re模块正则表达式中的re.S

    在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下代码: import re ...

  5. python基础===string模块常量

    In [8]: import string In [9]: dir(string) In [10]: string.ascii_letters Out[10]: 'abcdefghijklmnopqr ...

  6. linux系统定时任务设置

    .使用at命令设置一次性定时任务 2.使用crontab设置周期性定时任务 1)cd /home 目录下,使用vi test.py创建文件,内容如下: #!/usr/bin/python#coding ...

  7. yum和head一起用,报错“由于管道被破坏而退出”

    当要打印 [yum list ]时, 加上了管道符 以及 head 会出现报错 “由于管道被破坏而退出” 是因为 yum 与 head 连用 存在bug ,如果使用tail 则没有出现 具体什么bug ...

  8. ActiveMQ-如何使用JMS API?

    JMS编程模型 JMS定义了Java中访问消息中间件的一组接口,主要包括ConnectionFactory.Connection.Session.Destination.MessageProducer ...

  9. Groovy 与 DSL

    一:DSL 概念 指的是用于一个特定领域的语言(功能领域.业务领域).在这个给出的概念中有 3个重点: 只用于一个特定领域,而非所有通用领域,比如 Java / C++就是用于通用领域,而不可被称为 ...

  10. csu 1547(01背包)

    1547: Rectangle Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 996  Solved: 277[Submit][Status][Web ...