LCT维护子树信息的思路总结与其它问题详见我的LCT总结

思路分析

动态连边,LCT题目跑不了了。然而这题又有点奇特的地方。

我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘积。

掌握了LCT如何维护虚子树信息和后,做法就很清晰了。split(x,y)后,输出x的虚子树和+1与y的虚子树和+1的乘积;或者,(以y为根)输出x的子树总和与y的子树总和减去x的子树总和的乘积。

代码如下(这次我试着写了一个单旋"Spaly",好像常数还小不少。。。。。。)

#include<cstdio>
#include<cstdlib>
#define R register int
#define I inline void
const int N=100009;
int f[N],c[N][2],si[N],s[N];
bool r[N];
#define lc c[x][0]
#define rc c[x][1]
inline bool nroot(R x){return c[f[x]][0]==x||c[f[x]][1]==x;}
I pushup(R x){
s[x]=s[lc]+s[rc]+si[x]+1;
}
I pushdown(R x){
if(r[x]){
R t=lc;lc=rc;rc=t;
r[lc]^=1;r[rc]^=1;r[x]=0;
}
}
I pushall(R x){
if(nroot(x))pushall(f[x]);
pushdown(x);
}
I rotate(R x){
R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
if(nroot(y))c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;
f[w]=y;f[y]=x;f[x]=z;
pushup(y);
}
I splay(R x){//请忽略这个spaly
pushall(x);
while(nroot(x))rotate(x);
pushup(x);
}
I access(R x){
for(R y=0;x;x=f[y=x]){
splay(x);
si[x]+=s[rc];
si[x]-=s[rc=y];
//pushup(x);试着去掉,发现对答案无影响
}
}
I makeroot(R x){
access(x);splay(x);
r[x]^=1;
}
I split(R x,R y){
makeroot(x);
access(y);splay(y);
}
I link(R x,R y){
split(x,y);
si[f[x]=y]+=s[x];
pushup(y);
}//LCT模板到此结束
#define G ch=getchar()
#define gc G;while(ch<'-')G
#define in(z) gc;z=ch&15;G;while(ch>'-')z*=10,z+=ch&15,G;
int main(){
register char ch;
register bool fl;
R n,q,u,v;
in(n);in(q);
for(R i=1;i<=n;++i)s[i]=1;
while(q--){
gc;fl=ch=='A';in(u);in(v);
if(fl)link(u,v);
else{
split(u,v);
printf("%lld\n",(long long)(si[u]+1)*(si[v]+1));//可以换成上面提到的另一种
}
}
return 0;
}

最新文章

  1. 360等杀掉了app的主进程后 ,如何自动开启 如何防止被kill
  2. 学习设计接口api(转)
  3. UITapGestureRecognizer响应顺序是怎么样的
  4. 5shift shell
  5. struts2 Session拦截器
  6. PHP中利用PHPMailer配合QQ邮箱实现发邮件
  7. win 10 Hbuilder1.2.1连接Genymotion 调试Android 软件
  8. HTML5经典案例学习-----新元素添加文档结构
  9. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
  10. JavaScript的异步运行机制
  11. sql复制表结构,复制表内容语句
  12. Android之极光推送发送自定义消息
  13. C语言 反序打印字符串中的单词
  14. 在 Eclipse Juno 上安装 Marketplace
  15. [BZOJ 4117] Weather Report
  16. isNaN使用的注意事项
  17. 如何转换指定 波长 到 RGB 颜色?
  18. zh-cn、en-us、zh-tw等表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)
  19. python3+request接口自动化框架
  20. DB120连接TTL--OpenWRT

热门文章

  1. Jenkins 登录信息无效。请重试。
  2. Centos6.8安装zabbix-3.2.6
  3. 十年磨一剑 Delphi重新崛起再写传奇
  4. JPA数据懒加载LAZY配合事务@Transactional使用(三)
  5. .NET Core阿里大于短信发送SDK修改以及使用
  6. GCC精彩之旅_2(转)
  7. yii2 查询构建器
  8. Mysql--Database Exception (#42) 数据库错误
  9. 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)
  10. Springdata mongodb 版本兼容 引起 Error [The &#39;cursor&#39; option is required, except for aggregate with the explain argument