当前位置: 首页 > news >正文

题解 CF191C 【Fools and Roads】

树上差分半裸题

常规思路是进行三次DFS,然后常规运算即可

这里提供两次dfs的思路(wyz tql orz

我们以样例2为例
5c6e936f5a219.png

我们考虑任意一条路径,令其起点为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;
}

转载于:https://www.cnblogs.com/Chen574118090/p/10460052.html

相关文章:

  • springMvc学习笔记(2)
  • 【组队竞赛学习】vue+node在线商城项目
  • lucene排序算法之向量空间模型(一)
  • 常见的几种数组去重的方法,总有一种适合你~
  • Python网络爬虫5 - 爬取QQ空间相册
  • 数据库插入10000000数据
  • 聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
  • 在win10上安装Linux系统安装
  • OSChina 周四乱弹 —— 你自己喜欢什么样的袜子
  • 中台之上(八):企业级业务架构的实现需要不断沟通和调整
  • 【译】Css Grid VS Flexbox: 实践比较
  • SecureCRT设置linux终端显示颜色
  • 一封奇怪的信--网易游戏(互娱)2019年-游戏测试开发工程师真题
  • SonarQube安装配置
  • EasyUI中使用textbox赋值,setValue和setText顺序问题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • @jsonView过滤属性
  • 【css3】浏览器内核及其兼容性
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C++类的相互关联
  • CSS3 变换
  •  D - 粉碎叛乱F - 其他起义
  • JavaScript设计模式与开发实践系列之策略模式
  • LeetCode算法系列_0891_子序列宽度之和
  • Lucene解析 - 基本概念
  • PaddlePaddle-GitHub的正确打开姿势
  • react 代码优化(一) ——事件处理
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • springMvc学习笔记(2)
  • Web标准制定过程
  • 多线程事务回滚
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 每天一个设计模式之命令模式
  • 使用权重正则化较少模型过拟合
  • 延迟脚本的方式
  • 智能合约Solidity教程-事件和日志(一)
  • Linux权限管理(week1_day5)--技术流ken
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​ssh免密码登录设置及问题总结
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #数学建模# 线性规划问题的Matlab求解
  • $refs 、$nextTic、动态组件、name的使用
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2)nginx 安装、启停
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (二)正点原子I.MX6ULL u-boot移植
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十三)Maven插件解析运行机制
  • (转)德国人的记事本
  • (转)一些感悟
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net 程序发生了一个不可捕获的异常