CF GYM105316A DP

A. Rajaee in the Kitchen

Problem - A - Codeforces

今天是拉贾伊的生日 Who Asked?

遗憾的是,没有人记得他的生日,所以他决定自己做一个生日蛋糕。他在厨房里寻找合适的配料,但不幸的是,除了一个正整数数组,他什么也没找到。他打算用下面的方法用这个数组做一个蛋糕:

  • 首先,他把数组分成几个连续的非空子数组。
  • 数组中的每个元素都应正好属于一个子数组。
  • 然后,他为每个子数组创建一条长度等于子数组中数字总和的边。
  • 然后,他用***他创建的所有边组成一个凸多边形的蛋糕。

Rajaee 想知道他能用多少种方法将数组分成更小的子数组,从而用它做成一个蛋糕。Rajaee 的数学太差了,所以他需要你的帮助,知道模数 109+7 的方法数。

如果每种方法中都有一个索引为 i 的元素属于两个不同的子数组,那么这两种方法就被认为是不同的。

输入

第一行包含一个整数 N (3≤N≤106) ,即数组的大小。 (3≤N≤106) ,即数组的大小。

第二行包含 N 个整数 a1,a2,..,aN (1≤ai≤109) ,即数组的元素。 (1≤ai≤109) ,即数组的元素。

输出

输出 109+7 的模数。

多边形至少是个三角形 那么最大的那条边就要小于总长度的1/2; 这样才能围成多边形

即每个子数组的边权和小于总边权的一半 所以要用前缀和预处理边权

我们设dpi表示 到第i位的方案数那么

dpi的转移方程推导: 我们要让每一条边都小于当前总边权的一半 对于每种组成的最后一条边 他的边权一定是sumj+1,i i为最后一条边的终点 j+1为最后一条边的起点 那么这条边也要满足小于总边权的一半 对于每一个最后一条边的合法起点 他前面的部分也一定是合法的 那么每找到一条这样的合法的最后一条边 他的方案数就增加dpj 那么也就是所有合法情况的前部分的前缀和

sum(dpj) (sum(j,r)<tot/2);

也就是已经有的分法 加一条合法边 我们枚举所有可能的合法新增边 那么其余的部分的分法直接调用 然后对他们累加

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5,mod=1e9+7;
long long a[N],sum[N],dp[N],dpsum[N];
int n;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}
    long long tot=sum[n];
    dp[0] = 1;
    dpsum[0] = dp[0];
    for(int i=1;i<=n;i++){
        long long tar=2*sum[i]-tot;
        int j=upper_bound(sum,sum+i,tar/2)-sum;
        if(j<=0)dp[i]=dpsum[i-1]%mod;
        else dp[i]=(dpsum[i-1]-dpsum[j-1])%mod;
        if(dp[i]<0)dp[i]+=mod;
        dpsum[i]=(dpsum[i-1]+dp[i])%mod;
    }
    cout<<dp[n]<<'\n';
    return 0;
}
相关推荐
怕浪猫1 分钟前
2028编程圈很火的10个Skills
算法·面试·github
Nil2085 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing5 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_35 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
loulanyue_5 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院6 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
suhan6 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
姜鱼问生6 小时前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan6 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan6 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法