Number of Components 思维

本文介绍了一种计算链中联通块数量的方法。通过分析点和边的贡献,提出了一种算法来解决此问题。该算法包括计算每个点的贡献以及每条边的贡献,并通过这些贡献计算出最终的联通块数。

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

传送门

题目描述

在一棵树内找三个点x,y,z,要求三个点之间的距离最大,

分析

在一条链中,可以观察出结论:联通块数 = 点数 - 边数

所以我们需要求出每个点的贡献以及每一条边的贡献
首先,每一个点只有在 a[i] >= l && a[i] <= r 的时候才会被选择,所以每一个点的贡献应该是 a[i] * (n - a[i] + 1)
然后每一条边的贡献,只有当两个节点同时在这个范围内,这条边才会被算进去,所以贡献应该是:min(a[i],a[i - 1]) * (n - max(a[i],a[i - 1]) + 1)

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC option("arch=native","tune=native","no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
ll a[N];
ll n;

int main(){
    scanf("%lld",&n);
    ll ans = 0;
    for(int i = 1;i <= n;i++) {
        scanf("%lld",&a[i]);
        ans += a[i] * (n - a[i] + 1);
    }
    for(int i = 1;i < n;i++){
        ans -= min(a[i],a[i + 1]) * (n - max(a[i],a[i + 1]) + 1);
    }
    printf("%lld\n",ans);
    return 0;
}

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/
### 减少高斯混合模型中的组件数量 为了减少高斯混合模型(Gaussian Mixture Model, GMM)中的组件数量,可以通过交叉验证方法评估不同组件数目下的模型性能,并选择最优的组件数。通常采用的信息准则包括AIC(Akaike Information Criterion)和BIC(Bayesian Information Criterion),这些准则是基于似然函数定义的,同时考虑了模型复杂度的影响。 ```python from sklearn.mixture import GaussianMixture import numpy as np n_components_range = range(1, 10) lowest_bic = np.infty bic = [] for n_components in n_components_range: # Fit a Gaussian mixture with EM gmm = GaussianMixture(n_components=n_components, covariance_type='full') gmm.fit(X_train) bic.append(gmm.bic(X_train)) if bic[-1] < lowest_bic: lowest_bic = bic[-1] best_gmm = gmm best_n_components = best_gmm.n_components ``` 通过上述代码片段可以找到最佳的组件数量[^3]。 ### 增加`reg_covar`参数以稳定协方差矩阵计算 对于GMM而言,在某些情况下可能会遇到样本量不足以支持协方差矩阵的有效估计的问题。此时,增加正则化项`reg_covar`可以帮助防止奇异情况的发生,从而提高数值稳定性。此参数向对角线添加一个小正值,使得即使在极端条件下也能得到合理的解。 ```python gmm_stable = GaussianMixture( n_components=best_n_components, covariance_type='full', reg_covar=1e-6 # 调整此处值可增强稳定性 ) gmm_stable.fit(X_train) ``` 适当增大`reg_covar`能够缓解由于数据稀疏引起的问题,但过高的值可能导致过度平滑的结果,因此应当谨慎选取合适的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值