社区讨论
求调,不知道为什么全是MLE
P2633Count on a tree参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lyth76zd
- 此快照首次捕获于
- 2024/07/20 09:54 2 年前
- 此快照最后确认于
- 2024/07/24 23:03 2 年前
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
int m,n,head[100005],tot,num[100005],len,f[100005][25],dep[100005];
long long Hash[100005],w[100005],last;
struct sd{
int next,to;
}edge[200005];
struct sb{
int l,r,v;
}tr[3000005];
void add(int x,int y)
{
edge[++tot].next=head[x];
edge[tot].to=y;
head[x]=tot;
}
int build(int l,int r)
{
int rt=++tot;
tr[rt].v=0;
if(l==r) return rt;
int mid=(l+r)>>1;
tr[rt].l=build(l,mid);
tr[rt].r=build(mid+1,r);
return rt;
}
int insert(int fa,int l,int r,int va)
{
int rt=++tot;
tr[rt].l=tr[fa].l;
tr[rt].r=tr[fa].r;
tr[rt].v=tr[fa].v+1;
// printf("%d %d\n",rt,tr[rt].v);
if(l==r) return rt;
int mid=(l+r)>>1;
if(va<=mid) tr[rt].l=insert(tr[fa].l,l,mid,va);
else tr[rt].r=insert(tr[fa].r,mid+1,r,va);
return rt;
}
int ask(int x,int y,int z,int a,int l,int r,int k)
{
if(l==r) return l;
int sum=tr[tr[x].l].v+tr[tr[y].l].v-tr[tr[z].l].v-tr[tr[a].l].v;
// printf("%d %d %d %d %d %d %d %d\n",sum,l,r,k,tr[x].l,tr[y].l,tr[z].l,tr[a].l);
int mid=(l+r)>>1;
if(sum>=k) return ask(tr[x].l,tr[y].l,tr[z].l,tr[a].l,l,mid,k);
else return ask(tr[x].r,tr[y].r,tr[z].r,tr[a].r,mid+1,r,k-sum);
}
void dfs1(int u,int fa)
{
int p=lower_bound(Hash+1,Hash+len+1,w[u])-Hash;
num[u]=insert(num[fa],1,len,p);
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
dfs1(v,u);
}
}
void dfs2(int u,int fa)
{
f[u][0]=fa;
for(int i=1;i<=19;i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
dep[v]=dep[u]+1;
dfs2(v,u);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=19;i>=0;i--)
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
for(int i=19;i>=0;i--)
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
return f[x][0];
}
int main()
{
// freopen("P2633_1.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&w[i]);
Hash[i]=w[i];
}
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
tot=0;
sort(Hash+1,Hash+n+1);
len=unique(Hash+1,Hash+n+1)-Hash-1;
num[0]=build(1,len);
dep[1]=1;
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=m;i++)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
x^=last;
int p=lca(x,y);
// printf("%d %d\n",x,lca(x,y));
last=Hash[ask(num[x],num[y],num[p],num[f[p][0]],1,len,k)];
printf("%lld\n",last);
}
}
调了一晚上,不知道怎么调MLE了
回复
共 3 条回复,欢迎继续交流。
正在加载回复...