[BFS序+线段树]HDU 5957Query on a graph 题解

Global Mapper与ArcGIS双剑合璧:自动化与半自动矢量化提取地物轮廓实战 本文详细介绍了如何结合Global Mapper的自动化批量提取与ArcGIS的半自动精细修整功能,高效完成地物轮廓矢量化工作。通过实战案例,阐述了利用Global Mapper快速抓取初步轮廓,再借助ArcGIS的ArcScan等工具进行精细化编辑和优化的完整工作流,有效提升地理信息数据处理效率。 阅读详情

题目大意

给出一个n个点n条边的图,有两种操作:

1.Uptate x k d 将所有距离x距离不超过k的所有节点加d

2.Query x k 统计所有距离x距离不超过k的所有节点

n ≤ 1 0 5 , 0 ≤ k ≤ 2 n\le 10^5,0\le k \le 2 n≤105,0≤k≤2

解题分析

基环树常用套路:将整个环当做一个根节点,然后建树。

然后用BFS建树的时候可以得到一个进队列的顺序,称之为BFS序(相对的也有DFS序)。

那么自己画个图就会发现一个节点的儿子节点和孙子节点在BFS序上都在一个区间内,那么直接区间修改,用线段树维护,但这道题不是树而是基环树,所以需要分类讨论一波,具体见代码。

示例代码

题目传送门

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=100005,maxe=200005;
int n,q,tot,tst,son[maxe],nxt[maxe],lnk[maxn],a[maxn],fa[maxn],BCC[maxn];
int hed,til,ti,que[maxn],id[maxn],Ls[maxn],Rs[maxn],Lg[maxn],Rg[maxn];
bool vs[maxn]; char st[10];
struct Seg{
	int tL[maxn<<2],tR[maxn<<2],tg[maxn<<2];
	LL sum[maxn<<2];
	inline int getL(int x){return x>1?x-1:a[0];}
	inline int getR(int x){return x<a[0]?x+1:1;}
	void Build(int L,int R,int p){
		tL[p]=L; tR[p]=R; sum[p]=tg[p]=0; if (L==R) return;
		int mid=L+(R-L>>1); Build(L,mid,p<<1); Build(mid+1,R,p<<1|1);
	}
	inline void Pushup(int x){sum[x]=sum[x<<1]+sum[x<<1|1];}
	inline void Addtag(int x,int tem){sum[x]+=(LL)(tR[x]-tL[x]+1)*tem; tg[x]+=tem;}
	inline void Pushdown(int x){if (tg[x]){Addtag(x<<1,tg[x]); Addtag(x<<1|1,tg[x]); tg[x]=0;}}
	inline void Insert(int L,int R,int x,int tem){
		if (tL[x]>R||tR[x]<L) return; if (L<=tL[x]&&tR[x]<=R) {Addtag(x,tem); return;}
		int mid=tL[x]+(tR[x]-tL[x]>>1); Pushdown(x);
		if (R<=mid) Insert(L,R,x<<1,tem); else if (L>mid) Insert(L,R,x<<1|1,tem);
		else {Insert(L,mid,x<<1,tem); Insert(mid+1,R,x<<1|1,tem);} Pushup(x);
	}
	LL Ask(int L,int R,int x){
		if (tL[x]>R||tR[x]<L) return 0; if (L<=tL[x]&&tR[x]<=R) return sum[x];
		int mid=tL[x]+(tR[x]-tL[x]>>1); Pushdown(x);
		if (R<=mid) return Ask(L,R,x<<1); else if (L>mid) return Ask(L,R,x<<1|1);
		else return Ask(L,mid,x<<1)+Ask(mid+1,R,x<<1|1);
	}
	inline LL Askone(int x){return Ask(x,x,1);}
	inline void Addone(int x,int tem){Insert(x,x,1,tem);}
	void Uptate(int x,int k,int tem){
		Addone(id[x],tem);
		if (k>=1){
			Insert(Ls[x],Rs[x],1,tem);
			if (!BCC[x]) Addone(id[fa[x]],tem);
			else {Addone(id[a[getL(BCC[x])]],tem); Addone(id[a[getR(BCC[x])]],tem);}
		}
		if (k>=2){
			Insert(Lg[x],Rg[x],1,tem);
			if (!BCC[x]){
				Addone(id[x],-tem); Insert(Ls[fa[x]],Rs[fa[x]],1,tem);
				int p=BCC[fa[x]]; if (!p) Addone(id[fa[fa[x]]],tem);
				else {Addone(id[a[getL(p)]],tem); Addone(id[a[getR(p)]],tem);}
			}else{
				int BL=getL(BCC[x]),BR=getR(BCC[x]); Insert(Ls[a[BL]],Rs[a[BL]],1,tem); Insert(Ls[a[BR]],Rs[a[BR]],1,tem);
				if (getL(BL)!=BR) Addone(id[a[getL(BL)]],tem);
				if (getR(BR)!=BL&&getR(BR)!=getL(BL)) Addone(id[a[getR(BR)]],tem);
			}
		}
	}
	LL Query(int x,int k){
		LL ans=Askone(id[x]); //自己节点
		if (k>=1){
			ans+=Ask(Ls[x],Rs[x],1); //儿子区间
			if (!BCC[x]) ans+=Askone(id[fa[x]]); //如果不在环上,加父节点
			else ans+=Askone(id[a[getL(BCC[x])]])+Askone(id[a[getR(BCC[x])]]);
            //如果在环上,加环上的左右节点
		}
		if (k>=2){
			ans+=Ask(Lg[x],Rg[x],1);//孙子区间
			if (!BCC[x]){
				ans+=Ask(Ls[fa[x]],Rs[fa[x]],1)-Askone(id[x]);//兄弟节点
				int p=BCC[fa[x]]; if (!p) ans+=Askone(id[fa[fa[x]]]);
				else ans+=Askone(id[a[getL(p)]])+Askone(id[a[getR(p)]]);
			}else{
				int BL=getL(BCC[x]),BR=getR(BCC[x]); ans+=Ask(Ls[a[BL]],Rs[a[BL]],1)+Ask(Ls[a[BR]],Rs[a[BR]],1);
				if (getL(BL)!=BR) ans+=Askone(id[a[getL(BL)]]);
				if (getR(BR)!=BL&&getR(BR)!=getL(BL)) ans+=Askone(id[a[getR(BR)]]);
			}//左边的左边和右边的右边,要防取重
		}
		return ans;
	}
}T;
inline void readi(int &x){
	x=0; char ch=getchar(),lst='+';
	while ('0'>ch||ch>'9') {lst=ch; ch=getchar();}
	while ('0'<=ch&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
	if (lst=='-') x=-x;
}
void _add(int x,int y){son[++tot]=y; nxt[tot]=lnk[x]; lnk[x]=tot;}
void getBCC(int x,int y){for (int i=x;i!=y;i=fa[i]){a[++a[0]]=i; BCC[i]=a[0];} a[++a[0]]=y; BCC[y]=a[0];} //求环
void _dfs(int x,int dad){
	vs[x]=true;
	for (int j=lnk[x];j;j=nxt[j])
		if (son[j]!=dad) if (!vs[son[j]]){fa[son[j]]=x; _dfs(son[j],x);} else if (!BCC[x]) getBCC(x,son[j]);
}
void _bfs(int S){ //求BFS序
	hed=0; til=1; que[1]=S; id[S]=++ti;
	while (hed!=til){
		int x=que[++hed]; Ls[x]=ti+1;
		for (int j=lnk[x];j;j=nxt[j])
			if (!id[son[j]]&&!BCC[son[j]]){fa[son[j]]=x; que[++til]=son[j]; id[son[j]]=++ti;}
		Rs[x]=ti; //求x的儿子区间
	}
	for (int i=1;i<=til;i++){
		int x=que[i]; Lg[x]=2e9; Rg[x]=-2e9;
		for (int j=lnk[x];j;j=nxt[j])
			if (id[son[j]]>id[x]&&!BCC[son[j]]){Lg[x]=min(Lg[x],Ls[son[j]]); Rg[x]=max(Rg[x],Rs[son[j]]);} //求x的孙子区间
	}
}
int main()
{
	freopen("qtree0.in","r",stdin);
	freopen("qtree0.out","w",stdout);
	readi(tst);
	while (tst--){
		readi(n); tot=ti=a[0]=0;
		memset(lnk,0,sizeof(lnk)); memset(vs,0,sizeof(vs));
		memset(id,0,sizeof(id)); memset(BCC,0,sizeof(BCC));
		for (int i=1,x,y;i<=n;i++){readi(x); readi(y); _add(x,y); _add(y,x);}
		_dfs(1,0); for (int i=1;i<=a[0];i++) _bfs(a[i]); T.Build(1,ti,1);
		readi(q);
		for (int x,y,z;q;q--){
			scanf("%s",st); readi(x); readi(y);
			if (st[0]=='Q') printf("%lld\n",T.Query(x,y));
			else {readi(z); T.Uptate(x,y,z);}
		}
	}
	return 0;
}

话说回来如果只有区间修改的的话可以考虑树状数组,所以……这里就是个F(k)l(e)a(n)g(g)

[QMT量化交易小白入门]-二、如何用miniQMT获取沪深A股的板块列表、历史行情数据和实时行情数据 本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。 阅读详情

相关推荐

Vivado时序约束实战:input_delay在高速接口设计中的关键作用

本文深入探讨了在Vivado时序约束中,input_delay对于高速接口设计的关键作用。通过一个RGMII以太网接口调试的实际案例,解释了为何仅靠仿真正确而实际数据采集会失败,并揭示了set_input_delay约束的本质是告知时序分析工具外部芯片的时序关系,而非添加物理延迟。文章详细讲解了如何根据数据手册计算约束值、针对不同采样时钟方案(如移相时钟)进行约束,并指导如何通过时序报告验证约束效果,是解决FPGA高速接口时序问题的实战指南。

ee345的博客 252

HDU-5957 Query on a graph(线段树+树剖)

Query on a graph Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 325    Accepted Submission(s): 73 Problem Description You are given a

十分残念的博客 1004

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何改变传统芯片设计流程

本文深入探讨了Synopsys EDA中的AI黑科技DSO.ai如何革新传统芯片设计流程。通过数据驱动的方法论、功耗优化革命和时序收敛智能加速,DSO.ai显著提升了设计效率和质量,实现了从经验驱动到AI驱动的范式转变。文章还提供了实战指南,帮助团队跨越AI EDA的实施鸿沟。

weixin_29296241的博客 525

HDU 5957 线段树 附数据生成器

题目大意: 给一个树,然后再随便再多连一条边,形成一个带一个环的树。 一开始,所有树的节点的权重为0 有2个操作。 操作1: 距离结点u距离小于k的所有节点,权重+D 操作2:询问距离节点u距离小于k的所有节点的权重之和。 思路: 先假设题目的图只是一棵树,找一个根节点,BFS一下,dfn[i]表示i节点的BFS时间序列。 可以看出,每个节点的所有儿子的

ACMer不要报考高校代码为13627的移通学院! 1044

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2085

论文、报告中那些乱七八糟的图(甘特图、卡吉图,桑基图,小提琴图,弦图,螺旋图,风玫瑰图)

在一些论文或报告中,总是会看到一些熟悉的图,但作者总是不能好好说话,非得搞个洋名字、缩写字或者半洋半中的词来显示它多么高大上,有时候这种故弄玄虚、华而不实的写法也实在是让人看了不伦不类,图首先是让读者更容易看懂的,不是让你来故作高深、玩玄学的。

David_jiang 9427

HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)&lt;=k的点的集合,操作1:将S(u,k)内节点权值增加或者减小,操作2:查询S(u,k)内节点的权值和 题解:因为题目说了查询和更新的距离小于等于k,k最大为2,所以很显然要分情况讨论k为0、1、2的...

buerdepepeqi的优快云博客 259

图像传感器与信号处理——SFR算法/ISO 12233解读

图像传感器与信号处理——SFR算法图像传感器与信号处理——SFR算法1. 前言2. 基于视觉的分辨率测量方法3. 基于边界的SFR算法4. 基于正弦波的SFR算法 图像传感器与信号处理——SFR算法 SFR的全称是Spatial Frequency Response,空间频率响应。介绍SFR算法的参考文献主要是ISO 12233这篇英文文档。和读一般的论文感觉不同,文档读起来更加晦涩难懂,可能是因...

weixin_44580210的博客 1万+

Query on a graph HDU - 5957

http://acm.hdu.edu.cn/showproblem.php?pid=5957 好想但是难写 先求个生成树 并把多余边记下来 跑个bfs序并用线段树维护 bfs序和dfs序略有不同 对一个节点 遍历一遍其所有子节点并取最小最大值会得到其一级子节点在bfs序中的区间 再跑一遍就会得到二级子节点在bfs序中的区间 依此类推 然后就是恶心的分类讨论 写了一屏都没写完。。索性把所有要...

sunyutian1998的博客 238

基于上下文的 Listwise 重排模型(一):miRNN

2018年阿里团队提出的miRNN(Mutual Influence aware RNN)模型,首次将电商搜索重排建模为全局优化问题,通过RNN捕捉商品序列的相互影响,结合Beam Search生成最优排序,在淘宝搜索中实现GMV(商品交易总额)提升5%的突破。本文将结合论文细节与通俗案例,拆解这一工业级重排框架的核心逻辑。

进一步有进一步的欢喜~ 1918

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 400

HDU - 5957 Query on a graph (bfs序 + 线段树 + 分类大讨论)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题目大意:给出一个n个点n条边的图,保证图中没有自环和重边,图中的结点的初始权值为0。接下来进行q次操作,每次操作有以下两种: MODIFY u k d:将与点u的距离小于等于k的点的权值加上d; QUERY u k:查询所有与点u的距离小于等于k的点的权值和。 题目思路:由于给出的图是...

Lee_w_j__的博客 424

【系统安全】Windows内核权限提升漏洞(CVE-2024-30088)

CVE-2024-30088是Windows内核提权漏洞,由越南安全研究员@Bùi Quang Hiếu详细分析。漏洞发生在AuthzBasepCopyoutInternalSecurityAttributes函数中,该函数在复制SecurityAttributesList时会使用用户提供的指针,在校验及复制期间存在时间差,导致存在TOCTOU漏洞。

李同學AI安全 1325

Query on a graph HDU5957 沈阳ICPC重现赛

Query on a graph Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 369    Accepted Submission(s): 81 Problem Description You are give

SUNSET 725

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hdu 5957 Query on a graph

题解: 毒瘤题......首先bfs跑一遍图,生成一棵树,则只有一条边没有用上而且这条边链接的两个点在该树上的深度差为<=1,即深度差为-1,0,1三种情况(因为深度差大于2的话,bfs就会选这跳边当做树边了)。 做完bfs序后就可以直接上线段树了,因为每一层的数刚好是连续了,分情况讨论,k=0,k=1的情况比较好写,但k=2的时候情况很多。。。。 特殊边的点跟查找的...

qq_18869763的博客 202

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

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

Query on a graph(基环树 距离2区间更新 线段树 bfs序)

原题: http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意: 给出一个联通的简单图,NNN点NNN边,也就是基环树。现在有两种操作: 更新离点ppp距离小于等于kkk的点,使其权值加vvv 查询离点ppp距离小于等于kkk的点的权值和 解析: 基环树可以看成是一个环将一片森林的的根连起来。我们先拓扑一下,找到环上的点,放入根集合。 然后对于每个根...

QAQ 414

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[bfs序 线段树] HDU5957. Query on a graph

求出bfs序那么一个点的儿子和孙子都是在bfs序上连续的一段记一下这个区间,然后线段树维护一下因为有环,那么肯定有多出来的一条边,给这条边的两个端点以及这两个端点连出去的点打个标记就好了细节贼多#include <cstdio> #include <iostream> #include <algorithm> #include <queue>using namespace std;typedef l

CE玩家 475

HDU 5957 Query on a graph

HDU 5957 Query on a graph 2016ACM/ICPC亚洲区沈阳站 题意 \(N(N \le 10^5)\)个点,\(N\)条边的连通图。 有\(M \le 10^5\)操作: \(MODIFY\ u\ k\ d,k \le 2\):距离点\(u\)不超过\(k\)的点的权值都加上\(d\)。 \(QUERY\ u\ k\):询问距离\(d\)不超过\(k\)...

weixin_30871701的博客 99

HDU5957 Query on a graph

线段树 BFS序 题目传送门 **题目大意:**一个基环树,有点权。有询问和修改操作。修改有三个参数u,k,du,k,du,k,d,表示把距离uuu不超过kkk(包括自己,下同)的点都加上ddd。查询有两个参数u,ku,ku,k,表示求距离uuu不超过kkk的点权和。n≤1e5,k≤2n\leq 1e5,k\leq 2n≤1e5,k≤2。 先别管那条非树边。当k=1k=1k=1的时候是维护它爸爸和...

forezxl的博客 340

【HDU】5957 Query on a graph【分类讨论+bfs序线段树】

题目链接:Query on a graph水题#include <bits/stdc++.h> using namespace std ;typedef long long LL ; typedef pair < int , int > pii ; typedef unsigned long long ULL ;#define clr( a , x ) memset ( a , x , sizeof

poursoul 1360

[环套树 bfs序] ICPC 2016 Shenyang J & HDU5957 Query on a graph

按层建线段树,或者说是bfs序。 然后修改的一定是不超过5层里面的连续的段,可以在线段树上直接修改。 对于环+树,把环抠出来之后按树的方法做。代码丑#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll;inline char nc(){ static c

雯舞 780

hdu5957 ICPC-2016 沈阳 I bfs序+线段树+分类讨论

题面 思路: 用线段树维护bfs序,因为同一层的儿子的bfs序连续 很久没有写过分类讨论了 细节错误很多: 1. k == 2时要判在不在环上,环够不够长,fa[x]在不在环上 2. bfs序只保证所有儿子在连续区间,而层与层之间是不连续的。开始竟然天真的以为是连续的 调了 1h多 还写了 30多min 代码能力要加强! #include &lt;bits/stdc++.h&gt; #defin...

执子之手,与子偕老 307

牛影传说【线段树+BFS序运用】

题目:牛影村有N个据点,这些据点有N-1条双向道路连接,任意两个据点之间有且仅有一条路径相通。最初每个据点都驻扎着一些牛。神牛H具有法力无边的能力,他随时都可能会降临牛影村的某个据点,每来到一个据点,他可能使用如下三种法力中的一种:  1、在据点i中选择一头强壮的牛,复制一个一模一样的。(无牛可以继续复制 即直接+1即可)  2、把据点i及其所有与i有道路连接的据点中的所有牛都复制一分(这些据点的...

朝圣长生路 516

『CSU 1322』ZY‘s new company(线段树维护bfs序)

转载声明:http://blog.youkuaiyun.com/alpc_neverfarewell/article/details/39160735题意: zzy开了一家公司,然后他为公司制定了人事制度:为每个员工都定一个直接的上属(除了zzy自己),这样就把公司表示成了一个树形的人事关系图,树的最顶端就是zzy自己。如果a的直接上属是b则称a是b的一级下属,接下去的依次称为2级、3级……k级下属。由于如z

Gavinjou大笨象的博客 1189

HDU4008 Parent and son - dfs序/bfs序 - 线段树

传送门 题解:换根操作是老套路,这个有一问是求儿子中的信息,要用bfs序来维护; 要注意的是要求儿子的bfs序和本身并不是连续的。 代码: #include #include #include #include #include #define MAXN 100010 #define MAXM 200010 #define MAXL 20 #define INF (MAXN-2) #def

Mys_C_K的博客 814

HDU5390 tree dfs序+线段树分层离线+字典树求异或最大值

tree Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description Given a rooted tree(node 1 is the root) with n nodes. The ithnode has a p

上决╇ф的ACM 1149
上一篇: [Manacher+贪心]BZOJ 3790 神奇项链 题解
下一篇: [二分+交互]Codeforces#415 (Div. 1) 809B. Glad to see you! 题解
「已注销」
博客等级 码龄10年 9粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值