bzoj3289Mato的文件管理

链接

  http://www.lydsy.com/JudgeOnline/problem.php?id=3289

题解

  直接上莫队,用权值树状数组统计答案。
  时间复杂度 O(NNlogN2) ,空间复杂度 O(N)

代码

//莫队
#include <cstdio>
#include <algorithm>
#define lowbit(x) (x bitand -x)
#define maxn 60000
#define size 233
using namespace std;
int N, Q, lp[maxn], tmp[maxn], byte[maxn], ta[maxn], num[maxn], q[maxn][2], ans[maxn];
void add(int *r, int pos, int v){for(;pos<=N;pos+=lowbit(pos))ta[pos]+=v;}
int sum(int *r, int pos){int ans=0;for(;pos;pos-=lowbit(pos))ans+=ta[pos];return ans;}
bool cmp(int a, int b)
{return lp[q[a][0]]==lp[q[b][0]]?q[a][1]<q[b][1]:lp[q[a][0]]<lp[q[b][0]];}
void init()
{
    int i;
    scanf("%d",&N);
    for(i=1;i<=N;i++)scanf("%d",byte+i),tmp[i]=byte[i];
    sort(tmp+1,tmp+N+1);
    for(i=1;i<=N;i++)byte[i]=lower_bound(tmp+1,tmp+N+1,byte[i])-tmp;
    for(i=1;i<=N;i++)lp[i]=i/size;
    scanf("%d",&Q);
    for(i=1;i<=Q;i++)scanf("%d%d",q[i],q[i]+1),num[i]=i;
    sort(num+1,num+Q+1,cmp);
}
void solve()
{
    int l=0, r=0, ql, qr, i, cnt=0;
    for(i=1;i<=Q;i++)
    {
        ql=q[num[i]][0], qr=q[num[i]][1];
        for(;l<ql;l++)if(l)
        {
            cnt-=sum(ta,byte[l]-1);
            add(ta,byte[l],-1);
        }
        for(l--;l>=ql;l--)
        {
            cnt+=sum(ta,byte[l]-1);
            add(ta,byte[l],1);
        }
        l=ql;
        for(;r>qr;r--)
        {
            cnt-=r-l+1-sum(ta,byte[r]);
            add(ta,byte[r],-1);
        }
        for(r++;r<=qr;r++)
        {
            cnt+=r-l-sum(ta,byte[r]);
            add(ta,byte[r],1);
        }
        r=qr;
        ans[num[i]]=cnt;
    }
}
int main()
{
    init();
    solve();
    for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值