spoj375树链剖分模板

本文介绍了一种解决树上动态查询问题的有效方法——树链剖分算法,并提供了完整的C++代码实现。该算法能够在树形结构中快速完成边权更新及路径最大边权查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

    对于一颗树,两种操作(1)修改某边权(2)查询两点间最大边权

解:树链剖分

代码(200ms):

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<ctime>
#include<queue>
#define For(i,j,k) for(register int i=(j);i<=(int)k;i++)
#define Forr(i,j,k) for(register int i=(j);i>=(int)k;i--)
#define Rep(i,u) for(register int i=Begin[(u)],v=to[i];i;i=Next[i],v=to[i])
#define Set(a,b) memset((a),b,sizeof(a))
using namespace std;
const int N=10010,E=20010;
int Begin[N],Next[E],to[E],fa[N],siz[N],son[N],dep[N],w[N],e=1,top[N],cnt,n;
int d[N][3];
void read(int &x){
	x=0;char c=getchar();int f(0);
	while(c<'0'||c>'9'){c=getchar();if(c=='-')f=1;}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();if(f)x=-x;
}
inline void add(int x,int y){to[++e]=y,Next[e]=Begin[x],Begin[x]=e;}
struct zkwtree{
	int T[N<<2],M;
	inline void clear(){Set(T,0);}
	inline void pushup(int x){T[x]=max(T[x<<1],T[x<<1|1]);}
	void Build(){for(M=1;M<=n+1;M<<=1);}
	void add(int x,int v){for(T[x+=M]=v,x>>=1;x;x>>=1)pushup(x);}
	int query(int s,int t){
		int ret=-0x3f3f3f3f;
		for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
			if(~s&1)ret=max(ret,T[s^1]);
			if(t&1)ret=max(ret,T[t^1]);
		}
		return ret;
	}
}t;
void dfs1(int u,int d){
	siz[u]=1;dep[u]=d;
	Rep(i,u)
		if(fa[u]!=v){
			fa[v]=u,dfs1(v,d+1),siz[u]+=siz[v];
			if(siz[v]>siz[son[u]])son[u]=v;
		}
} 
void dfs2(int u,int tp){
	top[u]=tp,w[u]=++cnt;
	if(son[u])dfs2(son[u],top[u]);
	Rep(i,u)
		if(son[u]!=v&&fa[u]!=v)
			dfs2(v,v);
}
void init(){
	read(n);
	Set(son,0),Set(Begin,0),Set(fa,0),e=1,cnt=0;
	For(i,1,n-1){
		read(d[i][0]),read(d[i][1]),read(d[i][2]);
		add(d[i][0],d[i][1]),add(d[i][1],d[i][0]);
	}
	dfs1(1,1);dfs2(1,1);
	t.clear();
	t.Build();
	For(i,1,n-1){
		if(dep[d[i][0]]>dep[d[i][1]])swap(d[i][0],d[i][1]);
		t.add(w[d[i][1]],d[i][2]);
	}
}
int Max(int x,int y){
	int tmp=-0x3f3f3f3f;
	for(;top[x]!=top[y];){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		tmp=max(tmp,t.query(w[top[x]],w[x]));
		x=fa[top[x]];
	}
	if (x==y)return tmp;
	if (dep[x]>dep[y])swap(x,y);
	return max(tmp,t.query(w[x]+1,w[y]));
}
void solve(){
	char s[10];
	while(scanf("%s",s)!=EOF){
		int x,y;
		if (s[0]=='D')break;
		read(x),read(y);
		if (s[0]!='Q')t.add(w[d[x][1]],y);
		else printf("%d\n",Max(x,y));
	}
}
int main(){
	int _;
	for(read(_);_;_--){
		init();
		solve();
	}
	return 0;
} 


内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值