社区讨论

为啥洛谷AC,上了poj&hdu都WA了???

P3834【模板】可持久化线段树 2参与者 4已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mi7yrxhb
此快照首次捕获于
2025/11/21 05:49
4 个月前
此快照最后确认于
2025/11/21 05:49
4 个月前
查看原帖
我这个小蒟蒻已经调了2个小时了。。。救救我吧。。。
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
namespace Flandle_Scarlet
{
    #define INT "%d"
    #define N 100100
    class HJT_SegmentTree
    {
        public:
            struct node
            {
                int l_s,r_s;
                int s;
            }tree[N*10];
            int root[N];
            int cnt;
            #define ls tree[index].l_s
            #define rs tree[index].r_s

            #define S tree[index].s
            #define lS tree[ls].s
            #define rS tree[rs].s

            void InitAll()
            {
                cnt=0;
                memset(root,0,sizeof(root));
                memset(tree,0,sizeof(tree));
            }

            int Build(int l,int r)
            {
                int index=++cnt;
                int mid=(l+r)>>1;
                if (l<r)
                {
                    ls=Build(l,mid);
                    rs=Build(mid+1,r);
                }
                return index;
            }
            int Add1(int pos,int l,int r,int pre)
            {
                int index=++cnt;
                tree[index]=tree[pre];
                ++S;

                if (l<r)
                {
                    int mid=(l+r)>>1;
                    if (pos<=mid)
                    {
                        ls=Add1(pos,l,mid,tree[pre].l_s);
                    }
                    else
                    {
                        rs=Add1(pos,mid+1,r,tree[pre].r_s);
                    }
                }
                return index;
            }
            int Query(int u,int v,int l,int r,int k)
            {
                if (l==r) return l;
                int tmp=tree[tree[v].l_s].s-tree[tree[u].l_s].s;
                int mid=(l+r)>>1;
                if (k<=tmp)
                {
                    return Query(tree[u].l_s,tree[v].l_s,l,mid,k);
                }
                else
                {
                    return Query(tree[u].r_s,tree[v].r_s,mid+1,r,k-tmp);
                }
            }
    }T;

    int a[N],n;int b[N],d;
    int q;
    void R1(int &x)
    {
//        x=0;char c=getchar();int f=1;
//        while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
//        while(c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
//        x=(f==1)?x:-x;
        scanf("%d",&x);
    }
    void Input()
    {
        R1(n);R1(q);
        for(int i=1;i<=n;++i)
        {
            R1(a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+n+1);
        d=unique(b+1,b+n+1)-b-1;
    }
    int Get(int x)
    {
        return lower_bound(b+1,b+d+1,x)-b;
    }

    void Soviet()
    {
        T.root[0]=T.Build(1,d);
        for(int i=1;i<=n;++i)
        {
            a[i]=Get(a[i]);
            T.root[i]=T.Add1(a[i],1,d,T.root[i-1]);
        }
        for(int i=1;i<=q;++i)
        {
            int l,r,k;R1(l),R1(r),R1(k);
            int p=T.Query(T.root[l-1],T.root[r],1,d,k);
            printf("%d\n",b[p]);
        }
    }

    void InitAll()
    {
        n=q=d=0;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        T.InitAll();
    }
    void IsMyWife()
    {
        if (0)
        {
            freopen("","r",stdin);
            freopen("","w",stdout);
        }
        int t;
        R1(t);
//        t=1;
        while(t--)
        {
            InitAll();
            Input();
            Soviet();
        }
    }
};
int main()
{
    Flandle_Scarlet::IsMyWife();
    return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...