牛客练习赛83 E.牛客推荐系统开发之标签重复度

LINK

比较明显的点分治问题,考虑如何计算通过点 u u u的路径贡献

d f s dfs dfs获得从 u u u出发的所有路径,显然经过 u u u的所有路径都是由 u u u出发的两条路径拼接而来

每条路径存成一个 p a i r pair pair,第一关键字为最大值,第二关键词为最小值

现在就是一个简单的二维偏序问题

s o r t sort sort一下那么每个位置的最大值一定比前面大

然后使用动态开点权值线段树,最小值为下标,维护每个位置的数量和权值和即可

比如对于第 i i i条路径,最大权值为 x x x,最小权值为 y y y,考虑和前 i − 1 i-1 i1条路径合并的贡献

在线段树上查询一下权值为 [ 0 , y − 1 ] [0,y-1] [0,y1]的个数 s u su su和权值和 s u m sum sum即可

y y y作为路径中最小值时,答案是 x ∗ y ∗ ( i − s u ) x*y*(i-su) xy(isu)

当其他路径作为最小值时,答案是 x ∗ s u m x*sum xsum

动态开点权值线段树常数略大,需要写成 v o i d \rm void void类型的版本

也可以写离散化的树状数组,就不需要卡常数

#include <bits/stdc++.h>
using namespace std;
#define mid (l+r>>1)
typedef long long ll;
const int maxn = 4e5+10;
const int inf = 998244353;
const int mod = 998244353;
int n,a[maxn];
ll ans;
vector<int>vec[maxn];
int siz[maxn],vis[maxn],mx[maxn],root,sumn;
typedef pair<int,int>p;
p res[maxn]; int top;

ll he[maxn<<4];
int shu[maxn<<4],ls[maxn<<4],rs[maxn<<4],id,rot;
void insert(int &rt,int l,int r,int v,int sz)
{
	if( !rt )	rt = ++id;
	if( l>v || r<v )	return;
	if( l==r && l==v )
	{
		shu[rt] += sz, he[rt] = he[rt]+sz*l;
		return;
	}
	insert( ls[rt],l,mid,v,sz ); insert( rs[rt],mid+1,r,v,sz );
	shu[rt] = shu[ls[rt]]+shu[rs[rt]], he[rt] = he[ls[rt]]+he[rs[rt]];
}
ll sum,su;
void ask(int rt,int l,int r,int L,int R)
{
	if( !rt )	return;
	if( l>R || r<L )	return;
	if( l>=L && r<=R )	{ su += shu[rt], sum += he[rt]; return; }
	ask(ls[rt],l,mid,L,R); ask(rs[rt],mid+1,r,L,R);	
}



void getroot(int u,int fa)
{
	siz[u] = 1, mx[u] = 0;
	for( auto v:vec[u] )
	{
		if( vis[v] || v==fa )	continue;
		getroot(v,u);
		siz[u] += siz[v];
		mx[u] = max( mx[u],siz[v] );
	}
	mx[u] = max( mx[u],sumn-siz[u] );
	if( mx[u]<mx[root] )	root = u;
}
void dfs(int u,int fa,int mi,int mx)
{
	res[++top] = p( mx,mi );
	for(auto v:vec[u] )
	{
		if( v==fa || vis[v] )	continue;
		dfs( v,u,min(mi,a[v]),max(mx,a[v]) );
	}
}
ll calc(int u,int l,int r)
{
	long long ans = 0;
	top = 0; dfs( u,u,l,r );
	sort( res+1,res+1+top );
	for(int i=1;i<=top;i++)//以最小值为下标 
	{
		//[1,i-1]的最小值有多少小于自己的	
		sum = 0, su = 0;
		ask(rot,0,inf,0,res[i].second-1);
        sum %= mod;
		ans = ( ans+1ll*res[i].first*sum%mod )%mod;
		ans = ( ans+1ll*res[i].first*res[i].second%mod*(i-su)%mod )%mod;
		insert( rot,0,inf,res[i].second,1 );
	}
	for(int i=1;i<=top;i++)	insert( rot,0,inf,res[i].second,-1 );
	return ans;
}
void solve(int u)
{
	vis[u] = 1; ans = ( ans+calc(u,a[u],a[u]) )%mod;
	for(auto v:vec[u] )
	{
		if( vis[v] )	continue;
		ans = ( ans-calc(v,min(a[u],a[v]),max(a[u],a[v])) )%mod;
		sumn = siz[v], mx[root=0] = n+1;
		getroot(v,0); solve( root );
	}
}
int main()
{
	scanf("%d",&n );
	for(int i=1;i<=n;i++)	scanf("%d",&a[i] );
	for(int i=1;i<n;i++)
	{
		int l,r; scanf("%d%d",&l,&r);
		vec[l].push_back( r ); vec[r].push_back( l );
	}
	sumn = n, mx[root=0] = n+1;
	getroot(1,0); 
	solve(1);
	printf("%lld",(ans%mod+mod)%mod );
}
内容概要:本文系统阐述了在新电子电气架构(EEA)下,汽车主机厂研发模式的深刻变革,涵盖研发重心向软硬协同与核心域功能转移、研发流程向敏捷迭代与跨部门协作升级、合作模式与科技公司及生态伙伴深融合,以及验证方式向虚拟仿真与用户参与结合转变。同时介绍了EEA开发的V型流程、开发周期缩短至2年左右的趋势,以及主机厂自研主导模式的兴起。文章还分析了EEA开发高昂成本(3-10亿元)中人力占比70%的构成,并探讨了其带来的BOM成本下降、OTA效率提升等显性与隐性收益。硬件层面,论述了从Multi-Box到One-Box、One-Board,最终迈向One-Chip的集成化演进路径。软件层面,强调SOA架构是实现软硬件解耦、支撑软件定义汽车(SDV)的关键,通过服务化、标准化接口提升灵活性与可扩展性。通信技术方面,指出车载以太网凭借高带宽、低延迟、轻量化等优势,正从主干网下沉至全车域,成为支撑智能化发展的信息高速公路。; 适合人群:汽车电子、智能汽车研发领域的工程师、技术管理人员及对EEA架构演进感兴趣的从业者。; 使用场景及目标:①理解新EEA架构下OEM研发模式的系统性转变及其背后的驱动因素;②掌握硬件集成(One-Box到One-Chip)、软件架构(SOA)和通信技术(车载以太网)三大核心技术的演进趋势与内在逻辑;③评估EEA自研的成本投入、收益模式及战略决策要点。; 阅读建议:此资源以宏观视角梳理了EEA变革的全貌,内容涉及技术、流程、成本与战略,建议读者结合自身工作领域,重点关注硬件集成路径、SOA实施方法或以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值