HDU 5452 Minimum Cut 树链剖分 + LCA

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试 本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。 阅读详情

大致题意:N-1条边形成一棵树;接下来M-N+1条边(u,v)表示从u走到v经过的所有边边权+1。这似乎是裸的树链剖分,但是我裸的树链剖分TLE了,M-N+1条边,这个常数还是很大的,我的树链剖分插入复杂度是log(N)*log(N),所以大概的复杂度是M*log(N)*log(N),是在这里超时了,可以想到(1,u)和v到(1,v)经过的边都+1,然后(1,LCA(u,v))经过的边-2,发现处理出来的边都是以1开头,就可以减少插入边的条数了。

Code:

#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 25000;

struct Edge {
    int to ;
    Edge * next;
}E[MAXN*2],*EE;

struct Gragh {
    Edge * first;
}G[MAXN];

struct Tree {
    int x,y;
    int value;
    int lazy;
}t[MAXN<<2];

int pre[MAXN],son[MAXN],siz[MAXN],dep[MAXN],top[MAXN],pos[MAXN],Rank[MAXN];
int N,M,K;
int num[MAXN];
int tree_idx = 0;
int tot ;

void Init() {
    EE = E;
    dep[1] = 1;
    pre[1] = 0;
    tree_idx = 0;
    tot = 1;
    memset(G,0,sizeof(G));
    memset(num,0,sizeof(num));
}

void addedge(int u,int v) {
    EE->to = v ; EE->next = G[u].first ; G[u].first = EE++;
    EE->to = u ; EE->next = G[v].first ; G[v].first = EE++;
}

void dfs1(int u) {
    siz[u] = 1;
    son[u] = 0;
    for(Edge * p = G[u].first ; p ; p = p -> next) {
        if(p->to != pre[u]) {
            pre[p->to] = u;
            dep[p->to] = dep[u] + 1;
            dfs1(p->to);
            siz[u] += siz[p->to];
            if(siz[p->to] > siz[son[u]])
                son[u] = p -> to;
        }
    }
}

void dfs2(int u,int ancestor) {
    top[u] = ancestor;
    tree_idx ++;
    pos[u] = tree_idx;
    if(son[u] != 0) {
        dfs2(son[u],ancestor);
    }
    for(Edge * p = G[u].first ; p ; p = p -> next) {
        if(p->to != pre[u] && p->to != son[u]) {
            dfs2(p->to,p->to);
        }
    }
} 

void Push_Up(int rt) {
    t[rt].value = min(t[rt<<1].value,t[rt<<1|1].value); 
}

void Push_Down(int rt) {
    if(t[rt].lazy) {
        t[rt<<1].lazy += t[rt].lazy;
        t[rt<<1|1].lazy += t[rt].lazy;
        t[rt<<1].value += t[rt].lazy;
        t[rt<<1|1].value += t[rt].lazy;
        t[rt].lazy = 0;
    }
}

void Build(int x,int y,int rt) {
    t[rt].x = x ; t[rt].y = y; t[rt].lazy = 0; 
    if(x == y) {
        t[rt].value = 1;
        if(x == 1) t[rt].value = 0x3f3f3f3f;
        return ;
    }
    int mid = (x + y) >> 1;
    Build(x,mid,rt<<1);
    Build(mid+1,y,rt<<1|1);
    Push_Up(rt);
}

void Update(int rt,int left,int right,int lazy) {
    if(t[rt].x >= left && t[rt].y <= right) {
        t[rt].lazy += lazy;
        t[rt].value += lazy;
        return ;
    }
    int mid = (t[rt].x + t[rt].y) >> 1;
    Push_Down(rt);
    if(mid >= left) {
        Update(rt<<1,left,right,lazy);
    }
    if(mid < right) {
        Update(rt<<1|1,left,right,lazy);
    }
    Push_Up(rt);
}

int ans;

// void Query(int rt,int left,int right) {
//     if(t[rt].x == t[rt].y) {
//         ans = min(t[rt].value,ans);
//         return ;
//     }
//     int mid = (t[rt].x + t[rt].y) >> 1;
//     Push_Down(rt);
//     if(mid >= left) {
//         Query(rt<<1,left,right);
//     } 
//     if(mid < right) {
//         Query(rt<<1|1,left,right);
//     }
//     // Push_Up(rt);
// }

void Change(int x,int y,int lazy) {
    //printf("lazy : %d\n",lazy);
    while(top[x] != top[y]) {
        if(dep[top[x]] < dep[top[y]]) swap(x,y);
        Update(1,pos[top[x]],pos[x],lazy);
        x = pre[top[x]];
    }
    if(x == y) return ;//如果是更新路径上的点,去掉这一句;
    if(dep[x] > dep[y]) swap(x,y);
    Update(1,pos[x]+1,pos[y],lazy);//如果是更新路径上的点,去掉+1
}

// void Query_Tree(int x,int y) {
//     while(top[x] != top[y]) {
//         if(dep[top[x]] < dep[top[y]]) swap(x,y);
//         Query(1,pos[top[x]],pos[x]);
//         x = pre[top[x]];
//     }
//     if(x == y) return ;
//     if(dep[x] > dep[y]) swap(x,y);
//     Query(1,pos[x]+1,pos[y]);
// }

int lca(int x,int y) {
    while(top[x] != top[y]) {
        if(dep[top[x]] < dep[top[y]]) swap(x,y);
        x = pre[top[x]];
    }
    if(x == y) return x;
    if(dep[x] > dep[y]) swap(x,y);
    return x;
}

char op[5];

// void print_tree(int rt) {
//     //printf("x : %d y : %d lazy : %d\n",t[rt].x,t[rt].y,t[rt].lazy);
//     if(t[rt].x == t[rt].y) {
//         printf("value : %d lazy : %d\n",t[rt].value,t[rt].lazy);
//         return ;
//     }
//     print_tree(rt<<1);
//     print_tree(rt<<1|1);
// }

int ReadInt() {
    char c = getchar();
    while(c > '9' || c < '0') c = getchar();
    int ret = 0;
    while(c <= '9' && c >= '0') {
        ret = ret * 10 + c - '0';
        c = getchar();
    }
    return ret;
}

void input() {
    scanf("%d %d",&N,&M);
    int u,v;
    for(int i = 1 ; i <= N - 1; i++) {
        scanf("%d %d",&u,&v);
        // u = ReadInt();
        // v = ReadInt();
        addedge(u,v);
    }
    dfs1(1);
    dfs2(1,1);
    Build(1,N,1);
    for(int i = 1 ; i <= M - N + 1; i++) {
        scanf("%d %d",&u,&v);
        num[u] ++;
        num[v] ++;
        int temp = lca(u,v);
        // printf("temp : %d\n",temp);
        num[temp] -= 2;
        // u = ReadInt();
        // v = ReadInt();  
    }
    for(int i = 1 ; i <= N ; i++) {
        if(num[i]) {
            Change(1,i,num[i]);
        }
    }
    ans = 0x3f3f3f3f;
    //print_tree(1);
    // Query(1,2,N);
    //Query_Tree(2,N);
    //print_tree(1);
    printf("%d\n",t[1].value);
}

int main(void) {
    //freopen("a.in","r",stdin);
    int T,casenum=1;
    scanf("%d",&T);
    while(T--){
        printf("Case #%d: ",casenum++);
        Init();
        input();
        //solve();
    }
    return 0;
}
AI 大模型应用数据中心的数据清洗工具 1. 背景介绍 在人工智能大模型应用的浪潮中,数据清洗作为数据预处理的重要环节,对于提升模型性能和可靠性具有至关重要的作用。数据中心作为人工智能模型的运行环境,面临着海量数据流和多样化的数据类型,如何高效、准确地进行数据清洗,成为应用大模型的关键问题之一。本文将详细介绍AI大模型应用数据中心的数据清洗工具,包括核心概念、算法原理、具体操作步骤、应用场 阅读详情

相关推荐

深度强化学习研究笔记(1)——入门(马尔科夫决策过程,贝尔曼方程,价值迭代和策略迭代)

1. 强化学习(Reinforcement learning)概述 强化学习(Reinforcement learning)的基本内涵是将问题用代理和环境进行建模。其中代理能够对环境执行一些特定的动作a∈Aa \in Aa∈A,从而到达某个状态s∈Ss \in Ss∈S,然后我们就可以根据该状态为代理赋予特定的奖励rrr。强化学习的基本思想如下图所示: 代理的目标是最大化未来的奖励总和,它通过将...

越野者的博客 5280

HDU - 5452 Minimum Cut 树上差分

题目链接:https://cn.vjudge.net/problem/HDU-5452 题意:n个点,m条边,前n-1条构成一棵树,问最少去掉多少遍使n个点不连通,前n-1条只能去一个 题解:对于一棵树,加上一条边,会形成对应的环,那么这个环上的边要想去掉的话,刚加上的那条边也要去掉,也就是说如果去掉这条边,所对应的最小边集的数量要加一,那么把n-1条边分配给点即可,这样直接思路就是树剖了,但...

还我笑颜 306

告别手动打卡:逍遥模拟器+宥马运动自动跑步脚本配置全流程

本文详细介绍了如何利用逍遥模拟器和自动化脚本实现宥马运动的自动跑步功能,告别手动打卡的繁琐。从环境准备、脚本部署到定位配置和智能调度,全流程指导用户完成自动化设置,提升效率并确保运动数据的真实性。

weixin_42532473的博客 536

HDU 5452-C - Minimum Cut 树链剖分

题意: 给出一个图G,给出里面的一颗生成树T, 找出一个割集,只包含T中的一条边, 让你输出边数最小的割集,的边数. 首先我们剖分一下生成树T。 接下来处理G中的其他边,对于这条边X,必然能在T上形成一个环,那么我们给这个环上(其实对于T是一条链)的所有点+1, 代表,如果以这些边的某一条作为我们选中的割集中的边的话,它将必须再删掉这个边X. 最后统计一下T中每条边,

缺氧 385

QLIB使用tushare更新每日行情

0. 介绍 qlib每日数据的源是yahoo,更新速度较慢并且不稳定。tushare每日行情是免费接口,速度较快。 1. 获取行情数据,保存为csv格式。 def GetDataFromTushare(self, today, fpath): pro = ts.pro_api() df = pro.daily(trade_date=today) for index, row in df.iterrows(): code = row['ts_code']

weixin_44177216的博客 2895

FPGA远程升级避坑实录:用STARTUPE2原语搞定Flash时钟,K7325T实测有效

本文深入解析了FPGA远程升级中的STARTUPE2原语应用,特别针对K7325T芯片的Flash时钟问题提供了实测有效的解决方案。通过详细的原语工作机制、Vivado工程实现步骤及调试技巧,帮助工程师规避常见陷阱,提升远程升级的可靠性和效率。

weixin_42558093的博客 141

HDU 5452 LCA

点击打开链接 题意:给一个树和树上的分支组成的图,问我当且仅当删除一条树上的边,最少再删除几条边使得图不连通 思路:我写了两个做法,第一种是不加优化的十分暴力的LCA,也就是裸的,因为这道题目的数据说很水,这样的复杂度也可以,O(n*m),n为20000,m为200000,明明是超时好不好,这个做法也简单易懂,在这个树上,我们加了一条边u->v,那么u与v的最近公共祖先为fa,那么u->f

Dan__ge的博客 3456

手把手教你用LTspice仿真TVS二极管:从选型验证到波形分析全流程

本文详细介绍了如何使用LTspice仿真TVS二极管,从选型验证到波形分析的全流程。通过搭建仿真环境、核心参数验证和系统级防护策略,帮助工程师低成本评估TVS性能,优化电路设计。特别适用于电源设计和接口防护领域,提升工作效率和设计准确性。

weixin_29234239的博客 643

HDU 5452 Minimum Cut (树链剖分)

#include<bits/stdc++.h> using namespace std; #define debug cout<<"YES\n"; #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #define ll long long #define lrt int l,int r,int rt #define ...

满月照亮的路 196

仿真每日一练 | Workbench如何在网格节点施加载荷

打开Workbench 2020 R2,在分析系统中双击静力分析工程项目,双击Geometry打开Design Modeler,在菜单栏的单位(Units)修改为毫米(Millimeter),在XY平面创建草图,在草图内绘制矩形并标注尺寸,拉伸长方体,如图1所示。:单个零部件,无连接关系,但需定义一个节点组件,如图5所示,选择Create Named Selection。对添加的节点组件施加Y方向50N的力,如图8所示。1-1-3.有限元系统模型构建。1-1-1.几何模型构建。1-1-2.材料定义。

ansysxuexizhe的博客 1236

无法获得下列放可solidworks standard 无法连接到服务器-15,10,10061如何解决?

无法获得下列放可solidworks standard 无法连接到服务器-15,10,10061如何解决?

qq_63539957的博客 2万+

hdu 5452 Minimum Cut

最近公共祖先 题意: 给你一个图,其中规定图上的一些边是这个图的一棵生成树的边 一个割如果只包含这棵树的一条边,那么它是一个尊敬割 问最小尊敬割(边没有权值) 数据范围: 点数 思路: 首先我们知道不存在不包含这棵树任意边的割,因为如果不包含这棵树的任意边,则点肯定能通过这棵树连通 我们先暴力地想,先把生成树变成有根,然后枚举每个点

ljhandlwt 511

RAGFlow升级指南(纯小白都看得懂)

升级背景:RAGFlow项目原来的版本是0.17.0版本,在使用过程中,发现当知识库检索为空的时候并且使用到rerank模型的时候,就会输出错误的信息;为了解决这个版本问题,特意升级到最新的版本0.17.2(截止2025-3-14时最新版本就是0.17.2了)官方升级文档https://ragflow.io/docs/dev/upgrade_ragflow官方文档对小白还是不太友好,作者也是捣鼓了十多分钟,特出下面的升级指南前提:旧版本的RAGFlow项目是启动好了的1.在ragflow目录下执行(拉取最新

Ven%的博客 3595

【树上差分||树链剖分】【HDU5452】Minimum Cut

题目 思路 如果删掉的树边已经决定,我们就只需要删掉连接两部分之间的边。 一条非树边被删,当且仅当树上路径上的边被删。 于是变成了路径+1,求最小值的问题。 可以用链剖,也可以用树上差分 代码 #include<bits/stdc++.h> #define ll long long using namespace std; const int N=2e4+77,M=2e5+77,ci=15; struct E { int v,next; }e[M<<1]; int ls[N],c

Brute♂force 357

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

hdu5452 Minimum Cut 树链剖分 + 标记贡献

// hdu5452 Minimum Cut 树链剖分 + 标记贡献 // // 解题思路: // // 比赛的时候,大神给出了思路.对于给定的一条边u,v // 一定会在树上与LCA(u,v)形成一个环.这条边所作出的贡献 // 就是u-v路径上所有的边都加一.最后求出边的最小的权值 // 然后加1.开始用了一个线段树维护.然后果断TLE了.在我 // 绝望的时候,发现了一篇大神直接模拟的过法

TIMELIMITE的专栏 716

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HDU - 5452 Minimum Cut(LCA+树上差分)

题目链接:点击查看 题目大意:给出n个点,n-1条边组成一棵树,然后再给出m-n-1条边,组成一个图,现在要让我们求最少删去几条边才能让整个图不连通,并且要求只能在树上删去最多一条边 题目分析:这个题目的意思有点难懂,大概就是需要删边,删去最少的边让整个图不连通,当我们在一棵树上继续加边的话,必定会形成环,假如我们想让u-v这里出现断点,那么我们就需要将u-v这条边在树上删去,然后再将与u和v...

Falcon的博客 651

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hdu5452 Minimum Cut(最近公共祖先LCA+差分前缀和)

Given a simple unweighted graph G (an undirected graph containing no loops nor multiple edges) with n nodes and m edges. Let T be a spanning tree of G. We say that a cut in G respects T if

芒果街上的小屋(此博客暂时停用) 506

HDU 5452 Minimum Cut(树链剖分+树差分)

题意:给你一颗生成树,然后有一些额外的边连接在生成树上的两点,问你最少要割几条边才能使图不连通,割的边中只能有一条生成树上的边,不能少也不能多 思路:训练没出,现在来补坑。我们稍加思考可以想到对于一颗生成树,我们其余的边相当于覆盖u,v之前的路线,如果你要割u,v之间的生成树的边的话就要多割一条,我们很直接的想到用线段树来维护区间操作,但是这个题在我们训练的时候是会超时的,所以我们改用树差分,因...

weixin_30642305的博客 181

#HDU5452#Minimum Cut(LCA+树剖)

Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others) Total Submission(s): 1712    Accepted Submission(s): 797 Problem Description Given a simple unw

ElaineZXY的博客 279

hdu5452(lca + 树上的操作)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5452解法:首先思路肯定是要枚举树上删掉的一条边,然后就转化为求树上分开的两块之间连的其它边的条数。我们看非树边(u,v),如果删除的边在lca(u,v)和u,v之间,那么这条边就会起到贡献,为1,如果删除的边在u,v的子树下,则没有起到贡献,同理如果删除的边在lca(u,v)上面的话,也不会

luotuoqingshan的博客 565

HDU - 5452 Minimum Cut LCA + imos和

传送门:HDU5452 题意:给出一个无向图G,求图G的最小边割集,并且使得割边中有且仅有一条属于图G的生成树T。 思路:考虑生成树中的每一条边i,将其去掉后生成树就被划分成两部分,则全图的割边就是那些跨越这两部分的边,将这些割边的数量记录为ans[i],但是求ans[]的过程显然不能暴力,考虑每条不在生成树中的边对答案的贡献,设其端点为u,v,则u -> v路径上所有边对应的ans[i]都应

WA是一笔财富 482

HDU 5452 Minimum Cut(贪心)

思路:只能切一条生成树上的边,一个比较直观的想法是只切度数为1的点的那条边,然后枚举这个叶子和外面连接的边数即可 #include using namespace std; const int maxn = 20000+7; #define inf 1e9 vectore[maxn]; int vis[maxn]; int deg[maxn],degg[maxn]; int n,m; i

围巾的ACM博客 760

HDU - 5452 - Minimum Cut(树形DP)

HDU - 5452 - Minimum Cut 题意: 有一颗生成树和一些边,将边加入生成树中得到新的图,求最少删多少条边,使得图分为两块,其中有且仅有一条边是属于最初的生成树的,其余的为后来加的边中的。   因为必须要在最初的生成树切一条边,而且只能切一条边,所以分离的那一部分一定是原生成树的其中一个子树。 我们就可以计算出所有子树分离出来要切去的边数,然后从中取出最小的即为答案...

vloai 226

hdu5452 离线最近公共祖先

题意是将一颗树cut一条边成两棵树,求生成的两棵树之间的连接边的数目。对于每条不是树上的边, a节点加1, b节点加1,LAC()

zzucaicai的专栏 881

hdu5452 Minimum Cut(lca+树上差分)

题意: 给定n个点m条边的无权无向图G, 给定图中的一棵生成树T, 要求找到一个G的割,满足恰好割掉了T的一条边, 问满足条件的最小割是多少。 数据范围:n<=2e4,m<=2e5 解法: 考虑枚举T被割掉的边,因为T是一棵树,割掉一条边之后就变为两个连通块, 那么最小割显然就是非树边中连接两个连通块的边的数量+1,加1是因为还要算上这条树边。 那么问题变为对于每条树边,计算有多少条非树边连接两端的连通块。 反过来想,考虑每条非树边对树边的贡献, 如果存在这样一条非树边(图中红色部分): 那么

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 171

hdu 5452 Minimum Cut (LCA)

题目大意:给一个n个点,m条边的无环、无重边的无向图,并且给出图中的一棵生成树,求最小割边集大小,使得边集中恰好包含生成树中的一条边。 考虑生成树中的每一个结点,将其子树与其父节点分离需要去掉其父边以及其子树中的结点与其他子树相连的边,其父边就是生成树中的边,与其他子树相连的边为非生成树中的边。这样只需统计每一个子树关联的非生成树中的边数,取最小值,然后+1就是答案。 对于每一个结点i

白学病患者的专栏 535
上一篇: hdu 1080 Human Gene Functions LCS变体
下一篇: ACM学习资源
_NMfloat_
博客等级 码龄12年 7粉丝 315原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值