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;

}


考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
参考内容中未提及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、付费专栏及课程。

余额充值