我目前正在对代码厨师执行this question。对于某些测试用例,我得到RE(运行时错误)。
这是我已经实现的逻辑:-
找到欧拉导览并创建数组(ar)
每个特里存储其子级,minimumVertex和maxStartTime。
trie [i]在ar中存储从1到i的值。
使用持久性从trie [i]创建trie [i + 1]
对于查询(顶点,k),在trie [ar中第二次出现顶点的索引]中找到最大xor
代码为:-
#include <bits/stdc++.h>
using namespace std;
typedef long in;
#define lcm(a,b) ((a*b)/__gcd(a,b))
#define max(a,b) ((a)>(b)?(a):(b))
#define vi vector<in>
#define vvi vector<vector<in> >
#define vpi vector<pair<in,in> >
#define pb push_back
#define mp make_pair
#define pii pair<in,in>
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define fio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
const in maxn=200005;
vector<in> adj[maxn];
vector<in> val(maxn);
vector<in> ar;
vector<pii> tme(maxn,mp(0,0));
vector<in> flag(maxn);
struct trie
{
trie* arr[2];
in minver,mst;//minimumVertex,maxStartTime
trie() {
arr[0]=arr[1]=NULL;
minver=maxn;
mst=0;
}
};
vector<trie*> ptries(2*maxn);
//persistent trie
trie* insert(trie* root,in ver)
{
trie* newroot=new trie();
trie* source=newroot;
in v=val[ver];
in st=tme[ver].fi;
trie* temp=root;
for(in i=19; i>=0; i--)
{
bool bit=v&(1<<i);
newroot->mst=max(newroot->mst,st);
if(temp!=NULL)
{
newroot->arr[!bit]=temp->arr[!bit];
temp=temp->arr[bit];
}
newroot->arr[bit]=new trie();
newroot=newroot->arr[bit];
}
newroot->mst=max(newroot->mst,st);
newroot->minver=min(newroot->minver,ver);
return source;
}
//euler tour
void dfs(in i,in p)
{
ar.pb(i);
for(in j:adj[i])
if(j!=p)
dfs(j,i);
ar.pb(i);
}
pii querytrie(in ver,in k)
{
trie* root=ptries[tme[ver].se];
in ans=0,v=k;
trie* temp=root;
for(in i=19; i>=0; i--)
{
bool bit=v&(1<<i);
if(temp->arr[!bit]!=NULL && (temp->arr[!bit]->mst)>=tme[ver].fi)//opposite bit there and maxStartTime >=startTime of ver
{
ans=ans|(1<<i);
temp=temp->arr[!bit];
}
else
temp=temp->arr[bit];
}
return {temp->minver,ans};
}
int main() {
// your code goes here
in t;
cin>>t;
while(t--)
{
ar.clear();
ptries.clear();
val.clear();
for(in i=0; i<maxn; i++)
{
adj[i].clear();
tme[i]=mp(0,0);
flag[i]=0;
}
in n,q;
cin>>n>>q;
for(in i=1; i<=n; i++)
cin>>val[i];
for(in i=1; i<n; i++)
{
in a,b;
cin>>a>>b;
adj[a].pb(b);
adj[b].pb(a);
}
dfs(1,0);
for (int i = 0; i < 2*n; i++) {
if (tme[ar[i]].fi == 0)
tme[ar[i]].fi = i+1;
else
tme[ar[i]].se = i+1;
}
ptries[1]=insert(new trie(),ar[0]);
in j=0;
for(in i=1; i<2*n; i++)
{
if(flag[ar[i]])
{
ptries[i+1]=ptries[i];
}
else
{
flag[ar[i]]=1;
ptries[i+1]=insert(ptries[i],ar[i]);
}
}
in xl=0,vl=0;
for(in i=1; i<=q; i++)
{
in a,b;
cin>>a>>b;
in v=a^vl,k=b^xl;
auto pp=querytrie(v,k);
cout<<pp .fi<<" "<<pp.se<<endl;
xl=pp.se;
vl=pp.fi;
}
}
return 0;
}
我不认为是因为额外的内存使用。可能引用了一些未分配的内存或某物。
请帮助我发现代码中的缺陷。