[bzoj 3626] LNOI2014 LCA

神题!

虽然想到离线,但是还是只会随机数据的做法。。。。

有一个比较有意思的结论:把点i到根的所有点权值设为1,其他点为0,此时j到根的所有点权和即为dep[LCA(i,j)]

不难发现,这个方法满足加法性质。

把询问查分,从1到n处理每个点,将其到根的权值+1,询问只要看这个点到根的权值和就是LCA的深度和了!

LCT维护即可

#include 
#include 
#include 

using namespace std;
typedef long long LL;
const int Maxn = 50005;
const int Mod = 201314;
int sum[Maxn], size[Maxn];
int fa[Maxn], rev[Maxn];
int w[Maxn], tip[Maxn];
int son[Maxn][2], ans[Maxn];
int n,m,x,l,r,i,j;
struct arr
{
  int num,x,ans;
  bool operator <(const arr &a)const
  {
    return num0) ans[q[j].ans] += sum[q[j].x];
        else ans[q[j].ans] -= sum[-q[j].x];
      j++;
    }
  }
  for (i=1;i<=m;i++)
    printf("%d\n",(ans[i]+Mod)%Mod);
  return 0;
}


你可能感兴趣的:(BZOJ,日常,LCT)