Codeforces Round #381 (Div. 2) C 思维 D树上差分

Codeforces 1467E DFS序 + 树上差分        题目大意为,定义合法的根:根到任意结点的路径上的点权唯一,求合法的根的数量。        我们很容易想到,合法的根的数量 = 总点数 - 非法根的数量。        对于任意点权相同的结点,只有它们之间的路径上的结点以及结点的子树才有可能合法,除此之外一定不合法。  &nb 阅读详情

C:

题意:有N个数的序列,接着给出M组(left,right),对于每一组(left,right)为下标对应的序列区间,mex为不在该区间的最小非负整数。这道这样一组N个数的序列,使得M个mex值中的最小值最大。
739A - Alyona and mex

Obviously, the answer to the problem can not be greater than the minimum length among the lengths of the sub-arrays. Suppose that the minimum length of all the sub-arrays is equal to len. Then the desired array is: 0, 1, 2, 3, ..., len - 1, 0, 1, 2, 3, ... len - 1... . Not hard to make sure that mex of any subarray will be at least len.

D:

题目http://codeforces.com/contest/739/problem/B

题意:一棵根节点为1的树,每个点都有点值a[i],每条边也有权值,dist(v, u)表示从v到u边权和,当u时v的子孙并且dist(v, u)<=a[u]时u就受v控制,输出每个结点能控制的结点数。

思路:如果v可以控制u,那么从v到u的路上的所有结点都可以控制u,因为从v到u路上的dist(vi, u)是递减的,可以每次遍历一个点的时候,二分找出根节点到当前点i路径上点,找出dist(j, i)刚好大于a[i]的点,使得ans[j]--,而后遍历当前点i的所有儿子结点k,ans[i] += ans[k]。

说是什么“差分”,http://blog.youkuaiyun.com/zhayan9qvq/article/details/54999472参考下。

这个别人的代码很6。。 感觉自己很难写出来。。

    #include <bits/stdc++.h>  
    using namespace std;  
    #define maxn 200010  
    #define ll long long int  

    vector<ll> val[maxn];  
    vector<int> G[maxn];  
    vector<pair<ll, int> > que;  

    ll dis[maxn], a[maxn];  
    int ans[maxn];  
    void dfs(int x, int fa){  
        ans[x] = 1;  
        ll t = dis[x] - a[x];  
        int pos = lower_bound(que.begin(), que.end(), make_pair(t, 0))-que.begin();  
        pos--;  
        if(pos>=0) ans[que[pos].second]--;  
        que.push_back(make_pair(dis[x], x));  
        for(int i = 0;i < G[x].size();i++){  
            int y = G[x][i];  
            if(y == fa) continue;  
            dis[y] = dis[x] + val[x][i];  
            dfs(y, x);  
            ans[x] += ans[y];  
        }  
        que.pop_back();  
    }  
    int main()  
    {  
        int n, i;  
        scanf("%d", &n);  
        for(i = 1;i <= n;i++) scanf("%I64d", &a[i]);  
        int v;  
        ll cost;  
        for(i = 2;i <= n;i++){  
            scanf("%d %I64d", &v, &cost);  
            val[i].push_back(cost);  
            val[v].push_back(cost);  
            G[i].push_back(v);  
            G[v].push_back(i);  
        }  
        dfs(1, -1);  
        for(i = 1;i <= n;i++) printf("%d%c", ans[i]-1, i==n?'\n':' ');  
    }  

这个代码更好看懂,
参考http://blog.youkuaiyun.com/cabinfever/article/details/53325717

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <iostream>

using namespace std;

const int maxn = 200010;
const int lg = 20;

int n;
long long a[maxn];
long long c[maxn];
struct edge
{
    int v,w,next;
}e[maxn << 1];
long long dep[maxn];
int h[maxn],num = 0;
int f[maxn][lg+1];
int u,v;
long long w;

void build(int u,int v,int w)
{
    num++;
    e[num].v = v;
    e[num].w = w;
    e[num].next = h[u];
    h[u] = num;
}

void dfs1(int x,int fa)
{
    int v;
    f[x][0] = fa;
    for(int i = 1; i < lg; i++)
        f[x][i] = f[f[x][i-1]][i-1];
    int u = x;
    for(int i = lg - 1; i >= 0; i--)
        while(u > 1 && dep[x] - dep[f[u][i]] <= a[x])
            u = f[u][i];
    u = max(1,u);
    c[f[u][0]]--;
    c[f[x][0]]++;
    for(int i = h[x]; i; i = e[i].next)
    {
        v = e[i].v;
        if(v != fa)
        {
            dep[v] = dep[x] + e[i].w;
            dfs1(v,x);
        }
    }
}

void dfs2(int x,int f)
{
    int v;
    for(int i = h[x]; i; i = e[i].next)
    {
        v = e[i].v;
        if(v != f)
        {
            dfs2(v,x);
            c[x] += c[v];
        }
    }
}

int main()
{
    freopen("1.in","r",stdin);
    cin >> n;
    for(int i = 1; i <= n; i++)
        scanf("%I64d",&a[i]);
    for(int i = 2; i <= n; i++)
    {
        scanf("%d%I64d",&v,&w);
        build(i,v,w);
        build(v,i,w);
    }
    dfs1(1,0);
    dfs2(1,0);
    for(int i = 1; i <= n; i++)
        printf("%I64d%c",c[i],i == n ? '\n' : ' ');
    return 0;
}
关于树上差分的一些理解 借鉴博客 一些题目: (由易到难) 洛谷P3258松鼠的新家 洛谷P2680运输计划 洛谷P1084疫情控制 树上差分是一个很好的技巧. 主要分为下面两种: 一.关于边的差分(如找被所有路径共同覆盖的边) 首先我们除了一般的up,deep等数组以外,多开一个数组:sum。 sum用来记录点的出现次数(具体点说实际上记录的是点到其父亲的边的出现次数, 我们这样处理: sum[u]+... 阅读详情

相关推荐

手把手教你搞定国民技术N32G031的Keil开发环境(附Pack包和JLink配置)

本文详细指导如何搭建国民技术N32G031的Keil开发环境,包括Keil MDK安装与激活、Pack包导入、JLink调试器配置等关键步骤。特别针对新手常见问题提供解决方案,帮助开发者快速上手N32G031系列MCU的开发工作。

cuangu9341的博客 426

codeforces1467 E. Distinctive Roots in a Tree(树上差分)

E. Distinctive Roots in a Tree 树上差分 如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一定不满足要求。 如果当前节点子树之外的节点(u上面的节点)与当前节点值相同,那么当前子树节点不满足要求。 如何知道当前子树中的节点是否与当前节点相同? dfs过程中记录进入该子树之前某值的个数与出子树后该值的个数进行比较,如果比之前多,说明子树中存在该值。 如何知道当前节点所有子树之外的节点是否存在

Fighting_Peter的博客 307

移动开发(一):使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。.NET MAUI 是一款开放源代码应用,是 Xamarin.Forms 的进化版,从移动场景扩展到了桌面场景,并从头重新生成了 UI 控件,以提高性能和可扩展性。

IT技术分享社区 2708

CodeForces 740D :Alyona and a tree 树上差分

传送门 题意 分析 求每个点控制了多少个点,等价于求每个点会被多少个点控制 考虑从根节点到每一个节点维护一条链,记录链上每一个节点到跟节点的距离,这样二分就可以求出距离当前点,最短的可以控制当前节点的点,然后对这个区间上每一个数+1即可,这个操作可以用查分来处理 代码 #pragma GCC optimize(3) #include <bits/stdc++.h> #define debug(x) cout<<#x<<":"<<x<<endl;

tlyzxc的博客 260

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 282

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9234

Codeforces Round 121 (Div. 1) C题 Fools and Roads(LCA最近公共祖先,树上差分)

先预处理出这棵树的LCA,之后对于每一对。树上差分记得从叶子向根节点,不要弄反。一道比较板的LCA和树上差分的题。,在树上做差分,最后用。

weixin_74754298的博客 437

YOLOv4目标检测算法——通俗易懂的解析

YOLOv4目标检测算法——通俗易懂的解析

chase 7135

codeforces 191 C. Fools and Roads(树上差分)

题目链接:https://codeforc.es/contest/191/problem/C 思路:树上差分模板 对于每一次修改s,t,将s,t的权+1;将LCA(s,t)和father[LCA(s,t)]的权-1;一个点最终被覆盖的次数就是这个点所在子树的权和。(这是对于点的差分),本题是关于边的,与点的差别就是将LCA(s,t)的权-2,且不减father[LCA(s,t)]的权 #i...

llmxby 387

YOLOv13结合Sobel边缘检测算子,实现EIEM(Edge Information Enhancement Module,边缘信息增强模块),强化空间特征提取

EIEM模块通过巧妙地结合Sobel边缘检测算子和现代卷积网络架构,实现了显式边缘信息增强的创新设计。这种方法不仅提高了网络对边缘特征的敏感性,还保持了良好的计算效率和模块化特性。 从技术实现角度看,EIEM展示了如何将经典计算机视觉算法无缝集成到深度学习框架中,为构建更强大、更可解释的视觉模型提供了新的思路。随着对边缘信息重要性认识的不断深入,以及对网络可解释性需求的增长,EIEM这样的显式特征增强模块将在未来的计算机视觉研究中发挥越来越重要的作用。

FJN110的博客 908

[ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429

[ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429 可以使用一些编码字符来制作URI,以访问WEB-INF目录的内容和/或绕过一些安全限制。默认合规模式允许带有包含 %u002e 段的 URI 的请求访问WEB-INF目录中的受保护资源。

qq_51577576的博客 3208

Codeforces 739B【树上倍增+差分】

思路: 先膜一发,真是羡慕施老板不知道差分也会自己创造差分的能力。 差分(这里的小差分): 比如你要算一棵树上 u->v 路径上的次数, v是 u 子树上的一个点, 算一棵树上 u->v 路径上的次数 就相当于算每个节点的次数吧, 对于每一对u, v (u -> v)的,用C[i]计数,可以C[fa[ u ]]–, C[fa[ v ]]++, 然后跑一下DFS,统计次数,具体处理就是对于每

ONE MORE TRY 841

ubuntu-emto-cpa 测试和使用(单核运行)

ubuntu-emto-cpa 测试和使用(单核运行)

qq_45834835的博客 1401

缩点+树上差分——Codeforces555E Case of Computer Network

题面:cf555e 简要题意:给出一个无向图,给出q个询问S,T表示从S走到T。问能否给这张图的边定向,使得满足q个询问我们首先发现对于每一个边双连通分量,两两之间是可以随便到达的,包括去到外面的点。所以我们把边双都缩成一个点,这张图就变成了一棵树 对于树进行操作就简单多了,我们只要在S,T,LCA位置打上差分标记(S打向上,T打向下,LCA打消除),然后一遍dfs从下往上扫一遍,如果某个节点向

2333:jzqjzq的博客专栏 497

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Codeforces Round #695 (Div. 2) F. Strange Housing (树上差分)

F. Strange Housing 题意 给一棵 nnn 个节点的树,每个节点都有一个权值。统计有多少个满足以下要求的节点:从这个点出发的任意路径中,没有两个相同的权值出现在同一路径。 题解 很难直接求出满足要求的节点,但是我们可以标记不符合要求的点。 如果遍历到点 uuu ,并且在 a[u]a[u]a[u] 没有全部出现在以 uuu 为根的子树中,那么 uuu 的子树都不满足,因为一定有一条路径经过 uuu 和另一个权值等于 a[u]a[u]a[u] 的点。 如果遍历到点 uuu ,并且在以 uuu

bandiaoz的博客 149

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Codeforces 19E 树上差分

思路: 先随便建出来一棵搜索树(图可能不连通?) 每一条非树边(剩下的边)和树边都可以构成一个环。 我们只看一个非树边和某些树边构成的这些环。 分成三种情况: 1.没有奇环 所有边都可以删 2.有一个奇环 奇环上的边可以删 3.有一堆奇环,一堆偶环 边化到点上 如果是奇环 非树边为(x,y) 在树上x,y这两个地方+1 lca(x,y)-2 偶环相反 做一遍树上递推上去...

weixin_34261739的博客 171

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

code forces739B 树上差分

B. Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Alyona has a tree with n vertices. The

黑码 582

Codeforces 739B(树上路径倍增及差分)

比较考验我思维的一道好题。 首先,做一遍DFS预处理出t[i][j]和d[i][j]。t[i][j]表示从第i个节点到离他第2^j近的祖先,d[i][j]表示从i开始到t[i][j]的路径上的路径权值总和。 在第一次DFS的同时,对节点x进行定位(结果为dist(x, y) 第一次DFS完成后,做第二次DFS统计答案(统计差分后的结果)。时间复杂度为O(NlgN)

cxhscst2 1072

Codeforces 191C (LCA+树上差分算法)

题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把”区间”修改转化为左右端点的修改 在树上,每个节点初始权值为0,对于每条路径(x,y),我们令节点x的权值+1,节点y的权值-1,节点LCA(x,y)的权值-2 最后进行一次DFS,求出F[x]表示x为根的质数中各节点的权值之和,...

oier_forever的博客 722

[洛谷P2664]树上游戏-虚树-树上差分

树上游戏题目描述lrb有一棵树,树的每个节点有个颜色。给一个长度为n的颜色序列,定义s(i,j) 为i 到j 的颜色数量。以及现在他想让你求出所有的sum[i]输入输出格式输入格式:第一行为一个整数n,表示树节点的数量第二行为n个整数,分别表示n个节点的颜色c[1],c[2]……c[n]接下来n-1行,每行为两个整数x,y,表示x和y之间有一条边输出格式:输出n行,第i行为sum[i]输入样例#1:

「嫌われ者のフィロソフィ」 1219

Codeforces 980E(树上贪心倍增)

题目链接: http://codeforces.com/contest/980/problem/EE. The Number Gamestime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe nation of Panel holds an a...

qq_36876305的博客 1560

BZOJ5293 || 洛谷P4427 [BJOI2018]求和【树上差分+LCA】

Time Limit: 20 Sec Memory Limit: 512 MB Description master 对树上的求和非常感兴趣。他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的。此处节点深度的定义是这个节点到根的路径上的边数。他把这个问题交给 了pupil,但pupil 并不会这么复杂的操作,你能帮他解决吗? ...

niiick 752

CodeForces 932D Tree(树上倍增)

一个不是很难的题目,因为读题问题居然做了好久。树上倍增做的也不多就写一下。 大致题意:总共有两种操作,一是添加,添加一个点连接到之前点的后面,并且有一个点权。另一个是询问,询问从某一个点开始,一直往上选取一个权值递增的序列,使得序列权值和小于x,问这个序列长度最长多少。 由于一开始读题都成一定要取连续的点,所以弄错了,其实是去一些离散的,权值递增的点即可。做法也比较简单,直接普通的倍增即可。设置dp[i][j],表示点i往上第j个比递增的点,s[i][j]表示从dp[i][j

alpc_qleonardo 619

[bzoj3331][强联通][树上差分]压力

Description 如今,路由器和交换机构建起了互联网的骨架。处在互联网的骨干位置的 核心路由器典型的要处理100Gbit/s的网络流量。他们每天都生活在巨大的压力 之下。 小强建立了一个模型。这世界上有N个网络设备,他们之间有M个双向的 链接。这个世界是连通的。在一段时间里,有Q个数据包要从一个网络设备发 送到另一个网络设备。 一个网络设备承受的压力有多大呢?很显然...

Rose_max的博客 530

CodeForces 191C Fools and Roads 树上的前缀和 LCA

题目链接:点击打开链接 题意: 给定n个点的树。 下面m个操作,每次给一条路径上的边都染一次。 最后问:每个边被染色的次数。 和去年网赛的一道差不多,就是类似前缀和的做法, 我们在某个点+1然后从叶子节点到根节点求一个前缀和,这样某个点加1就相当于某个点到根的路径都加了1. 所以当我们给[u,v]染色时就 sum[u]++; sum[v]++; sum[LCA(u,v)]-=2;

九野的博客 1832

codeforces 1076E Vasya and a Tree 树上差分

题意:给你一棵1为根节点的树,初始每个节点权值为0,有m次操作,每次操作 v d x,表示将以v为根的子树,深度不超过d的所有节点加上x。 思路:dfs的性质+差分思想,dfs记录以该节点为起点的所有操作影响的深度范围,在从该节点回溯时再把影响减去,因为dfs时只会在子树中遍历,所以用这种方法就把影响限制在了子树的规定深度中。 参考博客:https://www.cnblogs.com/pkgu...

常胜将军的博客 334
上一篇: Codeforces Round #388 (Div. 2)D. Leaving Auction
下一篇: [BZOJ4326][NOIP2015]运输计划(二分+dfs序+树上差分)
sega_handsome
博客等级 码龄10年 7粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值