2019 ICPC 南昌邀请赛 Max answer

本文介绍了一种算法问题,即寻找一个数组中所有可能区间的最大价值,其中区间价值定义为该区间内最小值乘以区间元素之和。通过前缀和与区间划分策略,文章详细阐述了如何高效地解决这一问题。

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

Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values in the interval, multiplied by the smallest value in the interval.

Now she is planning to find the max value of the intervals in her array. Can you help her?

Input

First line contains an integer n(1 \le n \le 5 \times 10 ^5n(1≤n≤5×105).

Second line contains nn integers represent the array a (-10^5 \le a_i \le 10^5)a(−105≤ai​≤105).

Output

One line contains an integer represent the answer of the array.

样例输入复制

5
1 2 3 4 5

样例输出复制

36

大致题意为有一个数组,数组有n个元素,每个元素有相应的大小,定义一个计算为选定一个区间,用这个区间内的最小值乘以这个区间内的元素加和,最后要求出所有这种计算所取得的最大值。

首先对题意进行分析,用区间内的最小值乘以区间和,那么区间应该怎么找,如果要最大化这个答案,很明显区间内的最小值是固定的,变化的只是以这个值为最小值的区间,那么很明显区间和应该越大越好;我们可以通过区间最小值来确定包含该最小值的最大区间和,由于该区间必须包含该最小值,所以我们可以利用前缀和,如果该最小值大于0,从该最小值的右边区间找到一个最大前缀和,从左边区间找出一个最小前缀和,然后做差与该区间的最小值相乘,就是这个区间所能贡献的最大答案;如果最小值小于零则反之处理。然后以这个值为最小值的区间已经找过,那么以后的i计算都不应该包含该值,所以可以由区间最小值来进行区间划分,然后归并处理,即可得到最终答案。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAX = (int)5e5 + 15;
const ll mod = 1e9+7;
pair<int,int> num[MAX];
pair<int,int> st1[MAX][20];
ll psum[MAX];
ll st2[MAX][20];
ll st3[MAX][20];

void ST(int n)            // ST表预处理最大最小值,实现快速查询
{
	for(int i=1;i<=n;i++){
		st1[i][0]=num[i];
		st2[i][0]=psum[i];
		st3[i][0]=psum[i];
	}
	st1[0][0]=st1[1][0];
	for(int k=1;k<=(int)log2(n);k++){
		for(int i=0;i<=n-(1<<k)+1;i++){
			st1[i][k]=min(st1[i][k-1],st1[i+(1<<(k-1))][k-1]);
			st2[i][k]=min(st2[i][k-1],st2[i+(1<<(k-1))][k-1]);
			st3[i][k]=max(st3[i][k-1],st3[i+(1<<(k-1))][k-1]);
		}
	}
}

ll div2(int l,int r)        //归并查询
{
	if(l>=r){
		if(r<=0)return (ll)num[l].first*(ll)num[l].first;
		else return (ll)num[r].first*(ll)num[r].first;
	}
	int k=log2(r-l+1);
	pair<int,int> temp=min(st1[l][k],st1[r+1-(1<<k)][k]);
	int mid=temp.second;
	ll numr,numl;
	ll nape=temp.first;
	if(nape>=0){
		k=(int)log2(r-mid+1);
		numr=max(st3[mid][k],st3[r+1-(1<<k)][k]);
		k=(int)log2(mid-l+2);
		numl=min(st2[l-1][k],st2[mid+1-(1<<k)][k]);
	}else{
		k=(int)log2(r-mid+1);
		numr=min(st2[mid][k],st2[r+1-(1<<k)][k]);
		k=(int)log2(mid-l+2);
		numl=max(st3[l-1][k],st3[mid+1-(1<<k)][k]);
	}
	nape=nape*(numr-numl);
	return max(nape,max(div2(l,mid-1),div2(mid+1,r)));
}

int main() 
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>num[i].first;
		num[i].second=i;
		psum[i]=psum[i-1]+num[i].first;
	}
	ST(n);
	cout<<div2(1,n)<<endl;
    return 0;
}

 

<think>嗯,用户想要找2024年ICPC昆明邀请赛目解析,但根据提供的引用内容,现有的资料只覆盖到2022年昆明的目,比如引用[1]提到2020、2021年的ICPC和CCPC目,以及引用[4]详细解析了2022昆明站的G。不过用户询问的是2024年的,这可能还没有公开的解析,或者可能还没有举办。需要先确认是否存在2024年的比赛信息,或者是否用户可能记错了年份?比如,2024年的比赛可能尚未举行,或者相关信息还未被整理发布。 首先,检查提供的引用内容,发现最新的昆明站信息是2022年的,引用[4]讨论的是2022昆明G。用户提到的2024年可能是个错误,或者他们希望提前获取信息。但通常比赛结束后才会有解析,所以需要告知用户目前没有相关资料,并建议他们关注官方渠道或后续的社区分享。同时,可以推荐现有的2022年昆明解作为参考,帮助用户了解型和考点,比如动态规划、期望计算等常见问。 另外,用户可能对如何准备比赛感兴趣,可以建议他们分析历年目类型,比如引用[1]提到的区域赛常考型,或者引用[3]中提到的训练经验。需要确保回答准确,避免提供不存在的资源,同时提供有用的替代信息,帮助用户找到最近的可用资料。</think>关于2024年ICPC昆明邀请赛目解析,目前尚未有官方或主流平台发布完整的目解析报告。根据历史信息推测,ICPC区域赛的目解析通常会在赛后由参赛队伍、算法社区或教练团队逐步整理发布。以下是可参考的备赛建议和现有资源: --- ### 一、近期ICPC型趋势参考 1. **动态规划与组合数学** 如2022年昆明站G考察了**概率期望与递推关系**,需掌握马尔可夫链、状态转移方程的建立[^4] $$E = \sum_{i=1}^n \left( \frac{p_i}{1-p_i} \cdot \sum_{j \neq i} \frac{p_j}{1-p_i} \right)$$ 此类问常需分析极限状态下的数学期望。 2. **数据结构优化** 近年区域赛常出现需要**线段树/树状数组维护区间性质**的目,例如区间最值、历史版本查询等。 3. **图论与网络流** 包括最小割建模、分层图最短路等高级技巧,如2021年沈阳站曾出现网络流与二分答案结合的目[^2]。 --- ### 二、获取解析的途径建议 1. **官方渠道** 关注ICPC官网及昆明站承办院校的赛事公告,解析可能通过**赛后解报告会**发布。 2. **算法社区** - **Codeforces**:搜索标签`[ICPC Kunming 2024]` - **知乎/掘金**:技术博主常撰写详细解(例:2022年G推导过程) 3. **训练平台** 尝试在**Codeforces Gym**或**牛客竞赛**库中查找昆明站模拟赛。 --- ### 三、历届昆明站真参考 若需练习类似型,可参考2022年昆明站目: - **G(豆子操作期望)**:结合概率论与递推,需推导稳定状态下的位置关系 - **B(几何构造)**:通过坐标系变换简化多边形切割问 ```python # 示例:概率期望计算的代码框架 def calculate_expected_value(probabilities): n = len(probabilities) expected = 0.0 for i in range(n): pi = probabilities[i] term = pi / (1 - pi) if pi != 1 else 0 sum_other = sum(pj / (1 - pi) for j, pj in enumerate(probabilities) if j != i) expected += term * sum_other return expected ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值