题解 CF191C 【Fools and Roads】
树上差分半裸题
常规思路是进行三次DFS,然后常规运算即可
这里提供两次dfs的思路(wyz tql orz)
我们以样例2为例

我们考虑任意一条路径,令其起点为u终点为v,每走一次当前路径则v的访问次数必定+1,于是我们可以使每一个点表示连接其上的一条边的访问次数,所以我们令节点v的访问次数+1;
与此同时,过程中的路径也同样会被访问,且这里是双向边,于是与此同时的我们也令节点u的访问次数+1;当然访问当前子树下根节点中包含的两个点并不会访问,而我们在增加u和v的访问时同时也错误地增加了其公共父节点的访问量,于是我们令lca(u,v)的访问量-2即可。
例如上图中我们从节点5走到节点3,我们令节点3与节点5的访问次数+1,同时使节点4的访问次数-2。
如下:
while(k--){
int u=read(),v=read();
diff[u]++,diff[v]++,diff[lca(u,v)]-=2;
}
最后输出答案时只需要判断每条边两端点的深度大小即可。
#include<bits/stdc++.h>
#define int long long
#define maxn 100005
using namespace std;
inline char get(){
static char buf[30000],*p1=buf,*p2=buf;
return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
register char c=get();register int f=1,_=0;
while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
return _*f;
}
struct edge{
int u,v,w,next;
int num=0;
}E[maxn<<1];
int n,k;
int p[maxn],eid;
int d[maxn], parent[maxn][20];
int diff[maxn];
inline void init(){
for(register int i=0;i<maxn;i++)p[i]=d[i]=-1;
eid=0;
}
inline void insert(int u,int v){
E[eid].u=u;
E[eid].v=v;
E[eid].next=p[u];
p[u]=eid++;
}
inline void insert2(int u,int v){
insert(u,v);
insert(v,u);
}
void dfs(int u){
for (register int i=p[u];~i;i=E[i].next) {
if (d[E[i].v]==-1){
d[E[i].v]=d[u]+1;
parent[E[i].v][0]=u;
dfs(E[i].v);
}
}
}
int lca(int x, int y) {
int i,j;
if(d[x]<d[y])swap(x,y);
for(i=0;(1<<i)<=d[x];i++);
i--;
for(register int j=i;j>=0;j--){
if (d[x]-(1<<j)>=d[y])x=parent[x][j];
}
if(x==y)return x;
for(register int j=i;j>=0;j--){
if(parent[x][j]!=parent[y][j]) {
x=parent[x][j];
y=parent[y][j];
}
}
return parent[x][0];
}
int dd[maxn];
void dfs_(int u,int fa,int flag){
dd[u]=flag;
for(register int i=p[u];~i;i=E[i].next){
int v=E[i].v;
if(fa==v)continue;
dfs_(v,u,flag+1);
diff[u]+=diff[v];
}
}
int u[maxn],v[maxn];
signed main(){
//freopen("1.txt","r",stdin);
init();
n=read();
for(register int i=2;i<=n;i++){
u[i]=read(),v[i]=read();
insert2(u[i],v[i]);
}
d[1]=0;
dfs(1);
for(register int level=1;(1<<level)<=n;level++){
for(register int i=1;i<=n;i++){
parent[i][level]=parent[parent[i][level-1]][level-1];
}
}
k=read();
while(k--){
int casu=read(),casv=read();
diff[casu]++,diff[casv]++,diff[lca(casu,casv)]-=2;
}
dfs_(1,-1,1);
for(register int i=2;i<=n;i++){
if(dd[u[i]]>=dd[v[i]])cout<<diff[u[i]]<<" ";
else cout<<diff[v[i]]<<" ";
}
return 0;
}
题解 CF191C 【Fools and Roads】的更多相关文章
- CF191C Fools and Roads - 树剖解法
Codeforces Round #121 (Div. 1) C. Fools and Roads time limit per test :2 seconds memory limit per te ...
- [CF191C]Fools and Roads
题目大意:有一颗$n$个节点的树,$k$次旅行,问每一条被走过的次数. 题解:树上差分,$num_x$表示连接$x$和$fa_x$的边被走过的次数,一条路径$u->v$,$num_u+1,num ...
- CF 191C Fools and Roads lca 或者 树链剖分
They say that Berland has exactly two problems, fools and roads. Besides, Berland has n cities, popu ...
- Codeforces 191C Fools and Roads(树链拆分)
题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...
- Fools and Roads CodeForces - 191C
Fools and Roads CodeForces - 191C 题意:给出一棵n个节点的树,还有树上的k条简单路径(用路径的两个端点u和v表示),对于树上每一条边,求出其被多少条简单路径经过. 方 ...
- LCA+差分【CF191C】Fools and Roads
Description 有一颗 \(n\) 个节点的树,\(k\) 次旅行,问每一条边被走过的次数. Input 第一行一个整数 \(n\) (\(2\leq n\leq 10^5\)). 接下来 \ ...
- [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...
- 【CF】121 Div.1 C. Fools and Roads
题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对 ...
- Codeforces 191 C Fools and Roads (树链拆分)
主题链接~~> 做题情绪:做了HDU 5044后就感觉非常easy了. 解题思路: 先树链剖分一下,把树剖分成链,由于最后全是询问,so~能够线性操作.经过树链剖分后,就会形成很多链,可是每条边 ...
随机推荐
- 关于Queue的相关问题
在多线程中使用Queue,发现总是有莫名的问题, 经折腾好久之后发现是因为没有加锁! 以下测试代码中, 如果不加锁, 添加 100W对象, 可能只会成功50W, 然后并不会产生异常! );//(如果初 ...
- spring加载属性(properties)文件
一.注解方式加载 jdbc.driver=org.mariadb.jdbc.Driver jdbc.url=jdbc:mariadb://localhost:3306/kt jdbc.user=roo ...
- iOS数据存储类型 及 堆(heap)和栈(stack)
iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 -- 由编译器自动分配释放. 2堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...
- NopCommerce 3.4中商品详情页面单选框、复选框的美化
先上图给大家看看效果,点这里打开网站(后期可能会找不到这个商品,现在再测试阶段) 现在你能看到的这个页面中,尺寸.文本描述是单选框(属性是我乱写的名字),上门安装是复选框.效果就看到这里,请君跳过图片 ...
- ASP.NET Core MVC如何上传文件及处理大文件上传
用文件模型绑定接口:IFormFile (小文件上传) 当你使用IFormFile接口来上传文件的时候,一定要注意,IFormFile会将一个Http请求中的所有文件都读取到服务器内存后,才会触发AS ...
- JAVA给你讲它的故事
计算机语言如果你将它当做一个产品,就像我们平时用的电视机.剃须刀.电脑.手机等, 他的发展也是有规律的. 任何一个产品的发展规律都是:向着人更加容易使用.功能越来越强大的方向发展. 那么,我们的计算机 ...
- 键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...
一.有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标 ...
- webstorm如何支持markdown
首先安装markdown 插件 第一个即可.
- Python Monitoring UPS with SNMPWALK
##Background My co-worker told me he needed to monitor UPS with SNMP module but he only can get hexa ...
- webpack-dev-server 多入口自动刷新,支持对象
万物的来源~webpack 本身 watch webpack watch 传送门 webpack 可以监听文件变化,当它们修改后会重新编译 watch boolean 启用 Watch 模式.这意味着 ...