[ 莫队 配对堆 ] BZOJ4241

%%%PBS教我打配对堆

配对堆的速度是set的6倍。。

#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void Read(int& x){
    char c=nc();
    for(;c<'0'||c>'9';c=nc());
    for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
typedef long long ll;
typedef pair<int,int> abcd;
typedef __gnu_pbds::priority_queue<ll,less<ll>,pairing_heap_tag> heap;
const int N=100010;
heap Q;
heap::point_iterator p[N];
char ss[30];
int Len;
inline void Print(ll x){
    if(!x){
        putchar(48);putchar('\n');
        return;
    }
    for(Len=0;x;x/=10)ss[++Len]=x%10;
    while(Len)putchar(ss[Len--]+48);
    putchar('\n');
}
#define fi first
#define se second
abcd d[N];
int k,n,m,q;
int s,b[N];
int a[N],w[N],num;
int L=1,R;
ll sum[N],Res,Ans[N];
struct Node{
    int l,r,id;
    inline bool operator < (Node x)const{
        if(b[l]!=b[x.l])return b[l]<b[x.l];
        return (b[l]&1?r<x.r:r>x.r);
    }
}c[N];
inline void Update(int x,int d){
    sum[w[x]]+=a[x]*d;
    Q.modify(p[w[x]],sum[w[x]]);
}
int main(){
    Read(n);Read(q);s=sqrt(n);
    for(int i=1;i<=n;i++)b[i]=(i-1)/s+1,Read(a[i]),d[i].fi=a[i],d[i].se=i;
    sort(d+1,d+n+1);
    w[d[1].se]=num=1;
    for(int i=2;i<=n;i++)
    if(d[i].fi==d[i-1].fi)w[d[i].se]=num;else w[d[i].se]=++num;
    for(int i=1;i<=q;i++)Read(c[i].l),Read(c[i].r),c[i].id=i;
    sort(c+1,c+q+1);
    for(int i=1;i<=num;i++)p[i]=Q.push(0);
    for(int i=1;i<=q;i++){
        while(R<c[i].r)Update(++R,1);
        while(L>c[i].l)Update(--L,1);
        while(R>c[i].r)Update(R--,-1);
        while(L<c[i].l)Update(L++,-1);
        Ans[c[i].id]=Q.top();
    }
    for(int i=1;i<=q;i++)Print(Ans[i]);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值