萌新初学OI,求调可持久化01trie
查看原帖
萌新初学OI,求调可持久化01trie
521276
张凯_巨大楼主2021/12/2 14:33
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,m,cnt;
int rt[2][100010];
struct nod
{
    int l,r,v;
};
vector<nod>s[2];
void add(int t,int o,int fo,int x)
{
    for(int i=29;i>=0;i--)
    {
        if(x&(1<<i))
        {
            s[t][o].r=s[t].size();
            s[t].push_back((nod){0,0,0});
            s[t][o].l=s[t][fo].l;
            s[t][o].v=s[t][s[t][o].l].v+s[t][s[t][o].r].v+1;
            o=s[t][o].r;
            fo=s[t][fo].r;
        }
        else
        {
            s[t][o].l=s[t].size();
            s[t].push_back((nod){0,0,0});
            s[t][o].r=s[t][fo].r;
            s[t][o].v=s[t][s[t][o].l].v+s[t][s[t][o].r].v+1;
            o=s[t][o].l;
            fo=s[t][fo].l;
        }
    }
}
int query(int t,int o1,int o2,int x)
{
    int ret=0;
    for(int i=29;i>=0;i--)
    {
        if(x&(1<<i))
        {
            if(s[t][o1].l-s[t][o2].l>0)
            {
                o1=s[t][o1].l;
                o2=s[t][o2].l;
                ret+=(1<<i);
            }
            else
            {
                o1=s[t][o1].r;
                o2=s[t][o2].r;
            }
        }
        else
        {
            if(s[t][o1].r-s[t][o2].r>0)
            {
                o1=s[t][o1].r;
                o2=s[t][o2].r;
                ret+=(1<<i);
            }
            else
            {
                o1=s[t][o1].l;
                o2=s[t][o2].l;
            }
        }
    }
    return ret;
}
int sz[100010],d[100010];
int vl[100010],id[100010];
int p[100010];
int fa[20][100010];
vector<int>e[100010];
void dfs(int x,int pre)
{
    id[++cnt]=x;
	sz[x]=1;
	d[x]=d[pre]+1;
	fa[0][x]=pre;
	for(int i=1;(1<<i)<d[x];i++)
    {
        fa[i][x]=fa[i-1][fa[i-1][x]];
    }
    rt[0][x]=s[0].size();
    s[0].push_back((nod){0,0,0});
    add(0,rt[0][x],rt[0][pre],vl[x]);
	for(int i=0;i<e[x].size();i++)
    {
        if(e[x][i]!=pre)
        {
            dfs(e[x][i],x);
            sz[x]+=sz[e[x][i]];
        }
    }
}
int lca(int x,int y)
{
    if(d[x]<d[y])
    {
        swap(x,y);
    }
    for(int i=19;i>=0;i--)
    {
        if(d[x]-d[y]>=(1<<i))
        {
            x=fa[i][x];
        }
    }
    for(int i=19;i>=0;i--)
    {
        if(fa[i][x]!=fa[i][y])
        {
            x=fa[i][x];
            y=fa[i][y];
        }
    }
    return fa[0][x];
}
int main()
{
    s[0].push_back((nod){0,0,0});
    s[1].push_back((nod){0,0,0});
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>vl[i];
	}
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)
    {
        rt[1][id[i]]=s[1].size();
        s[1].push_back((nod){0,0,0});
        p[id[i]]=i;
        add(1,rt[1][id[i]],rt[1][id[i-1]],vl[id[i]]);
    }
	while(m--)
    {
        int op;
        cin>>op;
        if(op==1)
        {
            int x,z;
            cin>>x>>z;
            cout<<query(1,rt[1][id[p[x]+sz[x]-1]],rt[1][id[p[x]-1]],z)<<endl;
        }
        if(op==2)
        {
            int x,y,z;
            cin>>x>>y>>z;
            int l=lca(x,y);
            cout<<max(query(0,rt[0][x],rt[0][fa[0][l]],z),query(0,rt[0][y],rt[0][fa[0][l]],z))<<endl;
        }
    }
	return 0;
}

wa成了10分,已经调自闭了。

2021/12/2 14:33
加载中...