萌新求调教
查看原帖
萌新求调教
1417453
chenzhishuo2012楼主2025/8/5 10:47
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define mid(l,r) (l+r>>1)
#define lowbit(x) (x&-x)
#define sqrt sqrtl
using namespace std;
const int N=1e5+10,M=1+10,mod=1e9+7;
const double eps=1e-1;
const long double pi=acos(-1);
int n,m,q,a,b,c[N],cnt,head[N],fa[N],dep[N],siz[N],son[N],top[N],tot,lst[N],tr[4*N],tr2[N],ans[N];
struct qury{
  int l,r,id;
}quon[N];
struct edge{
  int nxt,to;
}edg[2*N];
struct node{
  int col,val;
};
vector<node>v[N];
void addedge(int x,int y){
  edg[++cnt].nxt=head[x];
  edg[cnt].to=y;
  head[x]=cnt;
}
void dfs1(int x,int f){
  fa[x]=f;
  dep[x]=dep[f]+1;
  siz[x]=1;
  for(int i=head[x];i;i=edg[i].nxt){
    int y=edg[i].to;
    if(y==f)continue;
    dfs1(y,x);
    siz[x]+=siz[y];
    if(!son[x]||siz[son[x]]<siz[y])son[x]=y;
  }
}
void dfs2(int x,int t){
  top[x]=t;
  if(!son[x]){
    lst[t]=x;
  }
  else{
    dfs2(son[x],t);
    for(int i=head[x];i;i=edg[i].nxt){
      int y=edg[i].to;
      if(y==fa[x]||y==son[x])continue;
      dfs2(y,y);
    }
  }
}
int lca(int x,int y){
  if(!x||!y)return x+y;
  while(top[x]!=top[y]){
    if(dep[top[x]]<dep[top[y]])swap(x,y);
    x=fa[top[x]];
  }
  if(dep[x]>dep[y])swap(x,y);
  return x;
}
void pushup(int p){
  tr[p]=lca(tr[ls(p)],tr[rs(p)]);
}
void build(int l,int r,int p){
  if(l==r){
    tr[p]=c[l];
    return;
  }
  build(l,mid(l,r),ls(p));
  build(mid(l,r)+1,r,rs(p));
  pushup(p);
}
bool cmp(qury a,qury b){
  return a.l>b.l;
}
void update2(int x,int y){
  while(x<=m){
    tr2[x]+=y;
    x+=lowbit(x);
  }
}
void update(int x,int y){
  while(x){
    int pre=dep[top[x]]-1;
    node f;
    while(1){
      f=v[top[x]].back();
      if(dep[x]<=dep[f.val])break;
      v[top[x]].pop_back();
      if(f.col)update2(f.col,pre-dep[f.val]);
      pre=dep[f.val];
    }
    if(f.col)update2(f.col,pre-dep[x]);
    if(f.val==x)v[top[x]].pop_back();
    update2(y,dep[x]-dep[top[x]]+1);
    v[top[x]].push_back((node){y,x});
    x=fa[top[x]];
  }
}
int query2(int x){
  int ret=0;
  while(x){
    ret+=tr2[x];
    x-=lowbit(x);
  }
  return ret;
}
int query(int l,int r,int L,int R,int p){
  if(l>=L&&r<=R)return tr[p];
  if(R<=mid(l,r))return query(l,mid(l,r),L,R,ls(p));
  if(L>mid(l,r))return query(mid(l,r)+1,r,L,R,rs(p));
  return lca(query(l,mid(l,r),L,R,ls(p)),query(mid(l,r)+1,r,L,R,rs(p)));
}
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n>>m>>q;
  for(int i=1;i<n;i++){
    cin>>a>>b;
    addedge(a,b);
    addedge(b,a);
  }
  cout<<"1"<<endl;
  dfs1(1,0);
  dfs2(1,1);
  for(int i=1;i<=n;i++){
    if(top[i]==i)v[i].push_back((node){0,lst[i]});
  }
  for(int i=1;i<=m;i++)cin>>c[i];
  build(1,m,1);
  for(int i=1;i<=q;i++){
    cin>>quon[i].l>>quon[i].r;
    quon[i].id=i;
  }
  sort(quon+1,quon+q+1,cmp);
  int idx=1;
  for(int i=m;i>=1;i--){
    update(c[i],i);
    while(idx<=q&&quon[idx].l==i){
      ans[quon[idx].id]=query2(quon[idx].r)-dep[query(1,m,i,quon[i].r,1)]+1;
      idx++;
    }
  }
  for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
  return 0;
}

思路参考第二篇题解。 提交记录

2025/8/5 10:47
加载中...