vector内存池有咩有办法卡过捏
查看原帖
vector内存池有咩有办法卡过捏
374433
ppip嘟嘟嘟楼主2022/7/9 21:06

rt。record

主要这种写法不开vec会CE捏

#include <bits/stdc++.h>
using namespace std;
const int VL{1},VR(1e6),N(1e6);
struct tnode;
vector<tnode> mem;
struct pnode
{
    int id;
    tnode& operator*(){return mem[id];}
    tnode* operator->(){return &mem[id];}
    pnode& operator=(pnode n){id=n.id;return *this;}
    pnode(int p=0):id{p}{}
};
struct tnode
{
    pnode l,r;
    int sz;
};
pnode new_tnode(){mem.emplace_back();return mem.size()-1;}
pnode tree[N+5];
int pre[VR+5];
pnode Insert(pnode p,int k,int v,int cnt)
{
    pnode q{new_tnode()};*q=*p;
    q->sz+=v;
    if (cnt==1) return q;
    int cp{cnt>>1};
    if (k<=cp) q->l=Insert(p->l,k,v,cp);
    else q->r=Insert(p->r,k-cp,v,cnt-cp);
    return q;
}
int query(pnode p,int k,int cnt)
{
    if (p.id==0) return 0;
    if (cnt==1) return p->sz;
    int cp{cnt>>1};
    if (k<=cp) return p->r->sz+query(p->l,k,cp);
    else return query(p->r,k-cp,cnt-cp);
}
int main()
{
    int n;cin>>n;
    mem.emplace_back();
    for (int i{1};i<=n;++i)
    {
        int a;scanf("%d",&a);
        tree[i]=Insert(tree[i-1],i,1,n);
        if (pre[a]) tree[i]=Insert(tree[i],pre[a],-1,n);
        pre[a]=i;
    }
    int m;cin>>m;
    while (m--)
    {
        int l,r;scanf("%d %d",&l,&r);
        printf("%d\n",query(tree[r],l,n));
    }
    return 0;
}
2022/7/9 21:06
加载中...