【题意】

时间限制:20000ms
单点时限:1000ms
内存限制:256MB

描述

少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦。所以她出去晃了一晃,做起了一些没什么意义的事情来放松自己。
门前有一颗n个节点树,幽香发现这个树上有n个小精灵。然而这些小精灵都比较害羞,只会在一条特定的路径上活动。第i个小精灵会在ai到bi的路径上活动。
两个小精灵是朋友,当且仅当它们的路径是有公共点的。
于是幽香想要知道,有多少对小精灵a和b,a和b是朋友呢?其中a不等于b,a,b和b,a看做一对。

输入

第一行n和P (1 <= n, P <=100000),表示树的大小和小精灵的个数。树的节点从1到n标号。
接下来n-1行,每行两个数a,b,表示a到b之间有一条边。
接下来P行,第i行两个数ai,bi,表示小精灵i的活动范围是ai到bi,其中ai不等于bi。

输出

一行答案,表示对数。

样例输入
  1. 6 3
  2. 1 2
  3. 2 3
  4. 2 4
  5. 4 5
  6. 4 6
  7. 1 3
  8. 1 5
  9. 5 6
样例输出
  1. 2
  1.  

【分析】

   ORZ 。。。

   我好蠢。。一直想树剖以及线段的交。。。【并且不是线段

  大神题解here:

  两条树链相交,当且仅当一条树链的lca在另一条树链上,对于每个树链,统计有多少个树链的lca在被他包含,有时两条树链互相满足这个条件,但仅仅当这两条树链的lca相等时才会有,所以特判一下

  上面说得很清楚了,区间的和维护用树状数组就可以了。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. #define Maxn 100010
  9. #define LL long long
  10.  
  11. struct node
  12. {
  13. int x,y,next;
  14. }t[Maxn*];int len;
  15.  
  16. int first[Maxn],px[Maxn],py[Maxn];
  17.  
  18. void ins(int x,int y)
  19. {
  20. t[++len].x=x;t[len].y=y;
  21. t[len].next=first[x];first[x]=len;
  22. }
  23.  
  24. int son[Maxn],dfn[Maxn],sm[Maxn],dep[Maxn],fa[Maxn];
  25. void dfs1(int x,int f)
  26. {
  27. sm[x]=;son[x]=;dep[x]=dep[f]+;fa[x]=f;
  28. for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
  29. {
  30. int y=t[i].y;
  31. dfs1(y,x);
  32. sm[x]+=sm[y];
  33. if(sm[y]>sm[son[x]]) son[x]=y;
  34. }
  35. }
  36.  
  37. int tp[Maxn],cnt;
  38. void dfs2(int x,int f,int tpp)
  39. {
  40. dfn[x]=++cnt;tp[x]=tpp;
  41. if(son[x]) dfs2(son[x],x,tpp);
  42. for(int i=first[x];i;i=t[i].next) if(t[i].y!=f&&t[i].y!=son[x])
  43. dfs2(t[i].y,x,t[i].y);
  44. }
  45.  
  46. int c[Maxn],n;
  47. bool lca[Maxn];
  48.  
  49. void add(int x,int y)
  50. {
  51. for(int i=x;i<=n;i+=i&(-i))
  52. c[i]+=y;
  53. }
  54.  
  55. int query(int l,int r)
  56. {
  57. int ans=;
  58. for(int i=r;i>=;i-=i&(-i))
  59. ans+=c[i];
  60. l--;
  61. for(int i=l;i>=;i-=i&(-i))
  62. ans-=c[i];
  63. return ans;
  64. }
  65.  
  66. int gans(int x,int y,int p)
  67. {
  68. int ans=,tt;
  69. while(tp[x]!=tp[y])
  70. {
  71. if(dep[tp[x]]<dep[tp[y]]) tt=x,x=y,y=tt;
  72. if(p==) ans+=query(dfn[tp[x]],dfn[x]);
  73. x=fa[tp[x]];
  74. }
  75. if(dep[x]<dep[y]) tt=x,x=y,y=tt;
  76. if(p==)
  77. {
  78. ans+=query(dfn[y],dfn[x]);
  79. return ans;
  80. }
  81. else return y;
  82. }
  83.  
  84. int main()
  85. {
  86. int p;
  87. LL ans=;
  88. scanf("%d%d",&n,&p);
  89. len=;
  90. memset(first,,sizeof(first));
  91. for(int i=;i<n;i++)
  92. {
  93. int x,y;
  94. scanf("%d%d",&x,&y);
  95. ins(x,y);ins(y,x);
  96. }
  97. for(int i=;i<=p;i++) scanf("%d%d",&px[i],&py[i]);
  98. sm[]=;dep[]=;
  99. dfs1(,);cnt=;
  100. dfs2(,,);
  101. memset(c,,sizeof(c));
  102. memset(lca,,sizeof(lca));
  103. for(int i=;i<=p;i++)
  104. {
  105. int x=gans(px[i],py[i],);
  106. lca[x]=;
  107. add(dfn[x],);
  108. }
  109. for(int i=;i<=p;i++)
  110. {
  111. int x=gans(px[i],py[i],);
  112. ans+=x;
  113. }
  114. for(int i=;i<=n;i++) if(lca[i])
  115. {
  116. int x=query(dfn[i],dfn[i]);
  117. ans-=x*(x-)/+x;
  118. }
  119. printf("%lld\n",ans);
  120. return ;
  121. }

2016-11-10 18:17:12

【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)的更多相关文章

  1. 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...

  2. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】

    任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...

  4. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 【树状数组维护区间最大值】

    题目传送门:http://codeforces.com/contest/799/problem/C C. Fountains time limit per test 2 seconds memory ...

  5. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

  6. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  7. HDU 1754 I hate it 树状数组维护区间最大值

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...

  8. Codeforces Round #425 (Div. 2) D 树链剖分 + 树状数组维护区间

    一看就知道 可以LCA判断做 也可以树链剖分拿头暴力 然而快速读入和线段树维护区间会T70 于是只能LCA? 线段树的常数不小 于是需要另外一种办法来进行区间加减和查询区间和 就是使用树状数组 这个题 ...

  9. hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组

    题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...

随机推荐

  1. 《c和指针》1.5编程练习问题

    <c和指针>1.5编程练习问题 #include<stdio.h>#include<stdlib.h>#include<string.h>#define ...

  2. 分享4个网址二维码API接口

    说明:把url=后面的网址改成你的,四种任选一.http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://lanyes.org ...

  3. oledb方式读取excel文件

    进入博客园后台发现12年11月份写的草稿没发,时隔1年,把它拉出来晒晒太阳. 前言 第一次做Excel文件导入,采用了oledb,不足之处,还请各位大牛指出,谨以此文对导入Excel做个总结. 一般步 ...

  4. java Spring 在WEB应用中的实例化

    .前面讲解的都是通过直接读取配置文件,进行的实例化ApplicationContext AbstractApplicationContext app = new ClassPathXmlApplica ...

  5. 初次使用nodejs的问题

    使用npm install -g 'xxx' 之后仍然报 Cannot find module 'xxx' 错误,可以通过设置环境变量来解决: export NODE_PATH=/usr/local/ ...

  6. Asp.Net部分面试题

    HTML.javascript部分 1. jQuery的美元符号$有什么作用? 答:个人理解:$指代jquery对象,拥有jquery对象所有的属性和成员 网友理解:在Jquery中,$是JQuery ...

  7. UDP协议疑难杂症全景解析

    转载:http://blog.csdn.net/dog250/article/details/6896949 UDP协议疑难杂症全景解析 2011-10-22 19:26 2989人阅读 评论(4)  ...

  8. IIS原理学习

    IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...

  9. Js获取fileupload的绝对路径时总是的到C:\fakepath\+文件名称的 解决方案

    解决方法: Internet选项->安全->自定义级别->将文件下载到服务器时包含本地目录路径  启用就可以了.

  10. samba和squid 安装

    一. samba配置1. 什么是sambaSamba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到.是一种在局域网上共享文件 ...