萌新求助树上主席树
  • 板块P4197 Peaks
  • 楼主xie_lzh
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/19 21:07
  • 上次更新2023/10/27 19:26:35
查看原帖
萌新求助树上主席树
256970
xie_lzh楼主2022/7/19 21:07

rt,不知道是被卡空间还是怎么样,数组开大就 MLEMLE 数组开小就 RERE

目前已知 RERE 部分已在程序内标出(注释掉就不会RE了,但会MLE)

实在调不出来了qwq

#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
    int r=0,f=1;
    char c=getchar();
    while(!isdigit(c))
    {
        if(c=='-')f=0;
        c=getchar();
    }
    while(isdigit(c))
    {
        r=(r<<1)+(r<<3)+c-48;
        c=getchar();
    }
    return f?r:-r;
}
const int N=2e5+5;
int n,m,q,h[N],ff[N],val[N],cnt;
int Map[N];

int find(int x,int dep=0)
{
    if(ff[x]==x) return x;
    return ff[x]=find(ff[x],dep+1);
}

struct node
{
    int x,y,w;
}a[500005];
bool cmp(node a,node b)
{
    return a.w<b.w;
}

struct tree
{
    int l,r,sum=0;
}tr[N*22];
int scnt=0;
int update(int p,int l,int r,int val)
{
    scnt++;
    int kkk=scnt;
    tr[kkk].sum=tr[p].sum+1;
    if(l==r) return kkk;
    int mid=(l+r)>>1;
    if(val<=mid)
    {
        tr[kkk].r=tr[p].r;
        tr[kkk].l=update(tr[p].l,l,mid,val);
    }
    else
    {
        tr[kkk].l=tr[p].l;
        tr[kkk].r=update(tr[p].r,mid+1,r,val);
    }
    return kkk;
}

int dfn[N],idx,fa[N][20],rd[N],rt[N],siz[N];
int head[N],to[N],nxt[N],cntt;
void add(int u,int v)
{
    to[++cntt]=v;
    nxt[cntt]=head[u];
    head[u]=cntt;
}

//建立主席树
void dfs(int now,int f)
{
    fa[now][0]=f;
    dfn[now]=++idx;
    for(int i=1;i<=15;i++)
        fa[now][i]=fa[fa[now][i-1]][i-1];
    if(h[now]==-114514) rt[idx]=rt[idx-1]; //新建的节点没有高度,不加入主席树
    else rt[idx]=update(rt[idx-1],1,1e5,h[now]);
    siz[now]=1;
    for(int i=head[now];i;i=nxt[i])
    {
        int v=to[i];
        dfs(v,now);
        siz[now]+=siz[v];
    }
}

int query(int p1,int p2,int l,int r,int k)
{
    if(l==r)
    {
        if(k>1) return 0;
        else return l;
    }
    int ss=tr[tr[p2].r].sum-tr[tr[p1].r].sum,mid=(l+r)>>1;
    if(k>ss) return query(tr[p1].l,tr[p2].l,l,mid,k-ss);
    else return query(tr[p1].r,tr[p2].r,mid+1,r,k);
}
signed main()
{
    n=read();m=read();q=read();
    cnt=n;
    for(int i=1;i<=n;i++)
        Map[i]=h[i]=read();
    for(int i=1;i<=n;i++)
        ff[i]=i;
    for(int i=1;i<=m;i++)
    {
        a[i].x=read();
        a[i].y=read();
        a[i].w=read();
    }
    sort(Map+1,Map+1+m);
    int tot=unique(Map+1,Map+1+m)-Map-1;
    for(int i=1;i<=m;i++)
        h[i]=lower_bound(Map+1,Map+1+tot,h[i])-Map;

    sort(a+1,a+1+m,cmp);
    int kk=0;
    for(int i=1;i<=m;i++)
    {
    	
    	
        int xx=find(a[i].x),yy=find(a[i].y);//就是这个 SB 并查集 RE 真不知道这怎么 RE 
        
        
        if(xx!=yy)
        {
            cnt++;
            ff[xx]=ff[yy]=cnt;
            ff[cnt]=cnt; val[cnt]=a[i].w;
            h[cnt]=-114514;
            kk++; rd[xx]++; rd[yy]++;
            add(cnt,xx);
            add(cnt,yy);
        }
    }                                       
    for(int i=1;i<=cnt;i++)
        if(rd[i]==0) dfs(i,0);
    Map[0]=-1;
    int v,x,k;
    while(q--)
    {
        v=read(),x=read(),k=read();
        for(int i=15;i>=0;i--)
            if(fa[v][i]!=0&&val[fa[v][i]]<=x)
                v=fa[v][i];
        printf("%lld\n",Map[query(rt[dfn[v]-1],rt[dfn[v]+siz[v]-1],1,1e5,k)]);
    }
}
2022/7/19 21:07
加载中...