JZOJ 5123. diyiti


题目:

传送门


分析:

在这里插入图片描述
对于情况 ( 1 ) (1) (1),我们先将所有数排序,然后枚举 i i i作为图 ( 1 ) (1) (1)中紫色的边,即上面三个边中最长的边,同时记录 n u m [ x ] num[x] num[x]存前 i − 1 i−1 i1个数两两相加得 x x x的方案数。再从 i i i向后枚举 j j j作为红色边来统计答案。
对于情况 ( 2 ) (2) (2),先将排好序的数组去重,然后枚举 i i i作为图 ( 2 ) (2) (2)中的红色边,从 i i i向前枚举 j j j作为紫色边,这样灰色边长度就是已知的,就能知道用这两种长度的木棍拼出红色边的方案数。这样再设一个 c n t cnt cnt,记录用比 j j j长的棍作紫色边的方案数,这样乘起来加到答案里就行了。


代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define ll long long
using namespace std;
ll num[10000005],sum[10000005];
ll f[5005],g[5005],h[5005];
ll s[5005],a[5005];
ll n,ans;
void getfg(){
    f[2]=g[3]=h[4]=1;
    for(ll i=2;i<n;i++) f[i+1]=f[i]*(i+1)/(i-1);
    for(ll i=3;i<n;i++) g[i+1]=g[i]*(i+1)/(i-2);
    for(ll i=4;i<n;i++) h[i+1]=h[i]*(i+1)/(i-3);
}
int main()
{
	freopen("yist.in","r",stdin);
	freopen("yist.out","w",stdout);
    scanf("%lld",&n);getfg();
    for(ll i=1;i<=n;i++){
        scanf("%lld",&s[i]);
        num[s[i]]++;    
    }
    sort(s+1,s+n+1);

    for(ll i=1;i<=n;i++){
        for(ll j=i+1;j<=n;j++)
        if(num[s[j]]>=3){
            ans+=sum[s[j]-s[i]]*g[num[s[j]]];
            while(s[j+1]==s[j]) j++;    
        }
        for(ll j=i-1;j>=1;j--)
        if(s[i]+s[j]<=1e7) sum[s[i]+s[j]]++;
    }
    ll pans=ans;
    n=unique(s+1,s+n+1)-s-1;
    for(ll i=1;i<=n;i++)
    if(num[s[i]]>=2){
        ll cnt=0;
        for(ll j=i-1;j>=1;j--){
            if(s[i]-s[j]>s[j]) break;
            if(s[i]-s[j]==s[j]) {ans+=(h[num[s[j]]]+f[num[s[j]]]*cnt)*f[num[s[i]]];break;}
            ans+=(f[num[s[j]]]*f[num[s[i]-s[j]]]+num[s[j]]*num[s[i]-s[j]]*cnt)*f[num[s[i]]];
            cnt+=num[s[j]]*num[s[i]-s[j]];
        }
    }
	cout<<ans;
    return 0;
}
### 关于 `torch_cluster` 中 KNN 实现及其在 PyTorch Geometric 的应用 #### 导入必要的并初始化数据 为了展示如何使用 `torch_cluster` 中的K近邻算法,在Python代码中首先需要导入相应的模块。这里不仅会引入PyTorch本身,还会加载专门用于处理图结构化数据的操作集——即`torch_cluster`。 ```python import torch import torch_cluster points = torch.tensor([ [0., 0.], [1., 1.], [2., 2.], [3., 3.] ]) ``` 上述代码片段创建了一个二维空间内的四个点组成的张量对象[^1]。 #### 构建K近邻图 通过调用`torch_cluster.knn_graph()`方法可以构建基于给定点集合的K近邻图。此函数接收输入特征矩阵(在这里是指坐标位置),指定每个顶点应连接的最大邻居数量,并返回表示边索引的结果向量。 ```python k = 2 edge_index = torch_cluster.knn_graph(points, k=k, loop=False) print(edge_index) ``` 这段程序将会输出一个形状为 `[2, num_edges]` 的整数型张量,其中每一列代表一条无向边两端节点对应的下标值。 #### 解决潜在的兼容性问题 值得注意的是,当尝试集成`torch_cluster`至项目环境时可能会遭遇不同软件包间的版本不匹配情况。为了避免此类麻烦的发生,建议事先查阅官方文档确认所使用的PyTorch版本是否位于受支持范围内;必要情况下调整相关依赖项以确保最佳性能表现[^2]。 #### 动态图场景下的应用价值 对于那些涉及动态变化拓扑结构的任务而言,比如某些类型的图神经网络模型训练过程里不断更新连通性的场合,则利用像`knn_graph`这样的工具来高效地重新计算最近邻关系显得尤为重要[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值