codevs1516 平均分数--逆序对

本文介绍了一种利用前缀和与逆序对计算的高效算法,通过求解左右边界条件下的非严格逆序对与严格逆序对,实现复杂度优化并进行总方案数的计算。算法细节包括数轴分析、合并排序技巧与最大公约数求解等,最终通过高斯求和公式简化计算过程。

设sum[i]为i的前缀和 
这里写图片描述 
显然对于左边的我们可以通过求逆序对,解决了 
这只是大于等于左边的,那么右边呢 
看这里 
这里写图片描述 
嗯,那么就是关于l我们要 求一个非严格逆序对(记作a)对于r求一个严格逆序对(记作b) 
那么,由数轴可知,ans = a - b; 
嗯 
然后就可以无脑求了 
不过要记得sum[0],否则就会错过只有一个人的情况 
嗯,然后总方案数就是高斯巧解…… 
然后约分,gcd也好

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <cstring>

#define KILL puts("haha");

usingnamespacestd;

constlonglongMAXN = 1000000+ 5;

longlongnum[MAXN],zh[MAXN],ans;

bool flag;

void merge(longlongl,longlongr)

{

   longlongmid = (l + r) >> 1;

   longlongs = l,t = mid + 1;

   longlongtot = l;

   while(s<= mid && t <= r)

   {

        if(num[s]< num[t] || ((num[s] == num[t]) * flag))

            zh[tot++] = num[s++];

        else

            zh[tot++] = num[t++],ans += mid - s+ 1;

   }

   while(s<= mid)

        zh[tot++] = num[s++];

   while(t<= r)

        zh[tot++] = num[t++];

   for(longlongi = l;i <= r;i ++)

        num[i] = zh[i];

   return;

}

void merge_sort(longlongl,longlongr)

{

   if(l>= r)

        return;

   longlongmid = (l + r) >> 1;

   merge_sort(l,mid);

   merge_sort(mid+1,r);

   merge(l,r);

   return;

}

longlong gcd(longlongx,longlongy)

{

   returny?gcd(y,x % y):x;

}

longlong gs(longlongx)

{

   return(x * (x + 1))>> 1;

}

longlong n,l,r;

longlong a[MAXN];

longlong sum[MAXN];

longlong ansa,ansb;

int main()

{

   scanf("%lld%lld %lld",&n,&l,&r);

   for(longlongi = 1;i<= n;i ++)

   {

        scanf("%lld",&a[i]);

        sum[i] = sum[i - 1] + a[i];

   }

   for(longlongi = 0;i<= n;i ++)

        num[i] = l * i - sum[i];

   ans = 0;

   merge_sort(0,n);

   ansa = ans;

   flag = true;

   ans = 0;

   for(longlongi = 0;i<= n;i ++)

        num[i] = r * i - sum[i];

   merge_sort(0,n);

   ansb = ans;

   ans = ansa - ansb;

   longlongmo = gs(n);

   longlongk = gcd(ans,mo);

   ans /= k;

   mo /= k;

   if(ans== 0)

       puts("0");

   elseif(ans- mo == 0)

        puts("1");

   else

        printf("%lld/%lld",ans,mo);

   return0;

}


一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
参考内容中未提及pta6 - 2使用分治法求解逆序数问题的相关内容,但一般来说,使用分治法求解逆序数问题的解题思路是基于归并排序的思想。分治法的核心是将一个大问题分解为多个小问题,分别解决这些小问题,然后将小问题的解合并得到大问题的解。 ### 解题思路 1. **分解**:将数组分成两个子数组,分别递归地求解这两个子数组的逆序数。 2. **合并**:在合并两个已排序的子数组时,统计跨越两个子数组的逆序数。当从右子数组中取出一个元素放到合并后的数组中时,说明左子数组中剩余的所有元素都与这个元素构成逆序对。 3. **返回结果**:将左子数组的逆序数、右子数组的逆序数和跨越两个子数组的逆序数相加,得到整个数组的逆序数。 ### 代码示例 ```python def merge_sort_and_count(arr): if len(arr) <= 1: return arr, 0 mid = len(arr) // 2 left, inv_left = merge_sort_and_count(arr[:mid]) right, inv_right = merge_sort_and_count(arr[mid:]) merged, inv_merge = merge_and_count(left, right) return merged, inv_left + inv_right + inv_merge def merge_and_count(left, right): merged = [] inv_count = 0 i, j = 0, 0 while i < len(left) and j < len(right): if left[i] <= right[j]: merged.append(left[i]) i += 1 else: merged.append(right[j]) j += 1 inv_count += len(left) - i merged.extend(left[i:]) merged.extend(right[j:]) return merged, inv_count arr = [1, 3, 5, 2, 4, 6] sorted_arr, inv_count = merge_sort_and_count(arr) print("逆序数:", inv_count) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值