【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)
【题意】
时间限制: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。输出
一行答案,表示对数。
- 样例输入
- 6 3
- 1 2
- 2 3
- 2 4
- 4 5
- 4 6
- 1 3
- 1 5
- 5 6
- 样例输出
- 2
【分析】
ORZ 。。。
我好蠢。。一直想树剖以及线段的交。。。【并且不是线段
大神题解here:
两条树链相交,当且仅当一条树链的lca在另一条树链上,对于每个树链,统计有多少个树链的lca在被他包含,有时两条树链互相满足这个条件,但仅仅当这两条树链的lca相等时才会有,所以特判一下
上面说得很清楚了,区间的和维护用树状数组就可以了。
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- #define Maxn 100010
- #define LL long long
- struct node
- {
- int x,y,next;
- }t[Maxn*];int len;
- int first[Maxn],px[Maxn],py[Maxn];
- void ins(int x,int y)
- {
- t[++len].x=x;t[len].y=y;
- t[len].next=first[x];first[x]=len;
- }
- int son[Maxn],dfn[Maxn],sm[Maxn],dep[Maxn],fa[Maxn];
- void dfs1(int x,int f)
- {
- sm[x]=;son[x]=;dep[x]=dep[f]+;fa[x]=f;
- for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
- {
- int y=t[i].y;
- dfs1(y,x);
- sm[x]+=sm[y];
- if(sm[y]>sm[son[x]]) son[x]=y;
- }
- }
- int tp[Maxn],cnt;
- void dfs2(int x,int f,int tpp)
- {
- dfn[x]=++cnt;tp[x]=tpp;
- if(son[x]) dfs2(son[x],x,tpp);
- for(int i=first[x];i;i=t[i].next) if(t[i].y!=f&&t[i].y!=son[x])
- dfs2(t[i].y,x,t[i].y);
- }
- int c[Maxn],n;
- bool lca[Maxn];
- void add(int x,int y)
- {
- for(int i=x;i<=n;i+=i&(-i))
- c[i]+=y;
- }
- int query(int l,int r)
- {
- int ans=;
- for(int i=r;i>=;i-=i&(-i))
- ans+=c[i];
- l--;
- for(int i=l;i>=;i-=i&(-i))
- ans-=c[i];
- return ans;
- }
- int gans(int x,int y,int p)
- {
- int ans=,tt;
- while(tp[x]!=tp[y])
- {
- if(dep[tp[x]]<dep[tp[y]]) tt=x,x=y,y=tt;
- if(p==) ans+=query(dfn[tp[x]],dfn[x]);
- x=fa[tp[x]];
- }
- if(dep[x]<dep[y]) tt=x,x=y,y=tt;
- if(p==)
- {
- ans+=query(dfn[y],dfn[x]);
- return ans;
- }
- else return y;
- }
- int main()
- {
- int p;
- LL ans=;
- scanf("%d%d",&n,&p);
- len=;
- memset(first,,sizeof(first));
- for(int i=;i<n;i++)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- ins(x,y);ins(y,x);
- }
- for(int i=;i<=p;i++) scanf("%d%d",&px[i],&py[i]);
- sm[]=;dep[]=;
- dfs1(,);cnt=;
- dfs2(,,);
- memset(c,,sizeof(c));
- memset(lca,,sizeof(lca));
- for(int i=;i<=p;i++)
- {
- int x=gans(px[i],py[i],);
- lca[x]=;
- add(dfn[x],);
- }
- for(int i=;i<=p;i++)
- {
- int x=gans(px[i],py[i],);
- ans+=x;
- }
- for(int i=;i<=n;i++) if(lca[i])
- {
- int x=query(dfn[i],dfn[i]);
- ans-=x*(x-)/+x;
- }
- printf("%lld\n",ans);
- return ;
- }
2016-11-10 18:17:12
【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)的更多相关文章
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...
- bzoj 2819 Nim dfn序+树状数组维护区间异或值
题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】
任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...
- 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 ...
- 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing
[题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...
- 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- HDU 1754 I hate it 树状数组维护区间最大值
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...
- Codeforces Round #425 (Div. 2) D 树链剖分 + 树状数组维护区间
一看就知道 可以LCA判断做 也可以树链剖分拿头暴力 然而快速读入和线段树维护区间会T70 于是只能LCA? 线段树的常数不小 于是需要另外一种办法来进行区间加减和查询区间和 就是使用树状数组 这个题 ...
- hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组
题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...
随机推荐
- 《c和指针》1.5编程练习问题
<c和指针>1.5编程练习问题 #include<stdio.h>#include<stdlib.h>#include<string.h>#define ...
- 分享4个网址二维码API接口
说明:把url=后面的网址改成你的,四种任选一.http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://lanyes.org ...
- oledb方式读取excel文件
进入博客园后台发现12年11月份写的草稿没发,时隔1年,把它拉出来晒晒太阳. 前言 第一次做Excel文件导入,采用了oledb,不足之处,还请各位大牛指出,谨以此文对导入Excel做个总结. 一般步 ...
- java Spring 在WEB应用中的实例化
.前面讲解的都是通过直接读取配置文件,进行的实例化ApplicationContext AbstractApplicationContext app = new ClassPathXmlApplica ...
- 初次使用nodejs的问题
使用npm install -g 'xxx' 之后仍然报 Cannot find module 'xxx' 错误,可以通过设置环境变量来解决: export NODE_PATH=/usr/local/ ...
- Asp.Net部分面试题
HTML.javascript部分 1. jQuery的美元符号$有什么作用? 答:个人理解:$指代jquery对象,拥有jquery对象所有的属性和成员 网友理解:在Jquery中,$是JQuery ...
- UDP协议疑难杂症全景解析
转载:http://blog.csdn.net/dog250/article/details/6896949 UDP协议疑难杂症全景解析 2011-10-22 19:26 2989人阅读 评论(4) ...
- IIS原理学习
IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...
- Js获取fileupload的绝对路径时总是的到C:\fakepath\+文件名称的 解决方案
解决方法: Internet选项->安全->自定义级别->将文件下载到服务器时包含本地目录路径 启用就可以了.
- samba和squid 安装
一. samba配置1. 什么是sambaSamba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到.是一种在局域网上共享文件 ...