求助范浩强
查看原帖
求助范浩强
160839
Prean楼主2020/5/4 23:24

简单的区间维护就写了排名分裂和简单的Insert,没想到WA了。。。

是我的string的使用有问题吗?

Code:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
const int M=1e5+2e2+5;
int cnt,root,f[M],s[M],rnd[M],chi[M][2];std::string str[M];
void undate(int now)
{   
    s[now]=s[chi[now][0]]+s[chi[now][1]]+1;
}
void split(int now,int k,int&x,int&y)
{
    if(!now)return void(x=y=0);
    if(k<=s[chi[now][0]])split(chi[y=now][0],k,x,chi[now][0]);
    else split(chi[x=now][1],k-s[chi[now][0]]-1,chi[now][1],y);
    undate(now);
}
int merge(int x,int y)
{
    if(!x||!y)return x+y;
    if(rnd[x]<rnd[y])return chi[x][1]=merge(chi[x][1],y),undate(x),x;
    else return chi[y][0]=merge(x,chi[y][0]),undate(y),y;
}
void Insert(int rank)
{
    int x,y;
    split(root,rank-1,x,y);
    rnd[++cnt]=rand();
    root=merge(merge(x,cnt),y);
}
signed main()
{
    int i,x,n,m;
    srand(time(NULL));
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);std::cout.tie(0);
    std::cin>>n;
    for(i=1;i<=n;++i)std::cin>>str[i],Insert(i);
    std::cin>>m;
    for(i=n+1;i<=n+m;++i)std::cin>>str[i]>>x,Insert(++x);
    for(std::cin>>m;m;--m)
    {
        int a,b;
        std::cin>>x;
        split(root,x,a,b);x=b;
        while(chi[x][0])x=chi[x][0];
        root=merge(a,b);
        std::cout<<str[x]<<"\n";
    }
}
2020/5/4 23:24
加载中...