USACO 奶牛抗议 Generic Cow Protests

Description

约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动。第i头奶牛的理智度 为Ai,Ai可能是负数。约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成 若干个小组,每个小组内的奶牛的理智度总和都要大于零。由于奶牛是按直线排列的,所以 一个小组内的奶牛位置必须是连续的。

请帮助约翰计算一下,存在多少种不同的分组的方案。由于答案可能很大,只要输出答 案除以1,000,000,009的余数即可。

Input Format

第一行:单个整数:N,1 ≤ N ≤ 10^6

第二行到N + 1行:在第i + 1行有一个整数:Ai,表示第i头奶牛的理智度,−10^5 ≤ Ai ≤ 10^5

Output Format

第一行:单个整数,表示分组方案数除以\(1,000,000,009\)的余数

Sample Input

4

2

3

-3

1

Sample Output

4

Hint

分别是[2 3 − 3 1],[2 3 − 3][1], [2][3 − 3 1],[2][3 − 3] [1]

Solution

本题很容易想到一个\(O(n^2)\)的DP,用\(f[i]\)表示前i个奶牛有几种分组方案,然后枚举\(j\),如果区间\([j+1,i]\)里的奶牛理智和大于零\(f[i]\)就加上\(f[j]\)即:

设\(s[i]\)为前i头奶牛的理智和

\[f[i]=\sum ^{i-1}_{j=0}[s[i]-s[j]>=0]*f[j]
\]

实际上\(f[i]​\)等于所有满足\(j<i,s[j]<=s[i]​\)的\(f[j]​\)的总和。

求解\(f[i]\)时位置编号是有序的顺序处理即可,但\(s​\)却是无序的且值很大无法解决。

可以发现位置编号很小,如果\(s​\)有序而位置编号无序的话可以用树状数组解决。那怎样才能让位置编号无序,\(s​\)有序?按\(s​\)从小到大排序即可。

Code

#include <cstdio>
#include <algorithm>
#define lowbit(x) ((x)&(-x))
#define LL long long inline int read(){
int num=0,k=1;char c=getchar();
while (c<'0'||c>'9'){if (c=='-')k=-1;c=getchar();}
while (c>='0'&&c<='9') num=(num<<1)+(num<<3)+c-48,c=getchar();
return num*k;
} struct info{
LL sum;
int id;
}ox[1000007];
bool cmp(info a,info b){return a.sum<b.sum||(a.sum==b.sum&&a.id<b.id);} const LL mod=1000000009;
LL n,ans,c[1000007],f[1000007]; int main(){
n=read()+1;
for (int i=2;i<=n;++i)
ox[i].sum=read()+ox[i-1].sum,ox[i].id=i;
ox[1].sum=0,ox[1].id=1;f[1]=1;
std::sort(ox+1,ox+n+1,cmp);
for (int i=1;i<=n;++i){
for (int p=ox[i].id;p;p-=lowbit(p))
f[ox[i].id]=(f[ox[i].id]+c[p])%mod;
for (int p=ox[i].id;p<=n;p+=lowbit(p))
c[p]=(c[p]+f[ox[i].id])%mod;
if (ox[i].id==n) break;
}
printf("%lld\n",f[n]);
}

USACO 奶牛抗议 Generic Cow Protests的更多相关文章

  1. 洛谷 2344 奶牛抗议 Generic Cow Protests, 2011 Feb

    [题解] 我们可以轻松想到朴素的状态转移方程,但直接这样做是n^2的.所以我们考虑采用树状数组优化.写法跟求逆序对很相似,即对前缀和离散化之后开一个权值树状数组,每次f[i]+=query(sum[i ...

  2. BZOJ2274: [Usaco2011 Feb]Generic Cow Protests

    2274: [Usaco2011 Feb]Generic Cow Protests Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 196  Solve ...

  3. 洛谷 P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row and numbered 1..N. The cow ...

  4. P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row and numbered 1..N. The cow ...

  5. [USACO]奶牛抗议(DP+树状数组+离散化)

    Description 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成 若干个小组 ...

  6. [Usaco2011 Feb]Generic Cow Protests

    Description Farmer John's N (1 <= N <= 100,000) cows are lined up in a row and numbered 1..N. ...

  7. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  8. [USACO11FEB]Generic Cow Protests

    思路: 动态规划.首先处理出这些数的前缀和$a$,$f_i$记录从第$1$位到第$i$位的最大分组数量.DP方程为:$f_i=max(f_i,f_j+1)$,其中$j$满足$a_i-a_j≥0$. # ...

  9. BZOJ 2274 [Usaco2011 Feb]Generic Cow Protests

    [题解] 很容易可以写出朴素DP方程f[i]=sigma f[j] (sum[i]>=sum[j],1<=j<=i).  于是我们用权值树状数组优化即可. #include<c ...

随机推荐

  1. 阿里巴巴 Java 开发手册(二): 常量定义

    1. [强制]不允许任何魔法值(即未经定义的常量)直接出现在代码中. 反例: String key = "Id#taobao_" + tradeId; cache.put(key, ...

  2. java基础 String

    标准格式:数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...};省略格式:数据类型[] 数组名称 = {元素1,元素2,...}; Scanner类实现的功能,可以实现键盘输入 ...

  3. hibernate左连接查询时在easyUI的dataGrid中有些行取值为空的解决办法

    1 当使用left join左连连接,sql语句为 select t from SecondPage t left join t.rightNavbar n where 1=1 页面中出现了部分空行的 ...

  4. .net core 使用swagger接口描述

    首先安装nuget包 Swashbuckle.AspNetCore.Swagger Swashbuckle.AspNetCore.SwaggerGen Swashbuckle.AspNetCore.S ...

  5. 【Python】模块和包

    模块 模块的概念 1. 每一个以扩展名 `py` 结尾的 `Python` 源代码文件都是一个 模块 2. 模块名 同样也是一个 标识符,需要符合标识符的命名规则 3. 在模块中定义的 全局变量 .函 ...

  6. 树莓派安装系统+ssh登录

    一.准备工作: (1)树莓派3b (2)官网下载系统 (3)SD卡 (4)网线 (5)SDFormatter.exe (6)win32diskimager.exe (7)putty (7)笔记本 二. ...

  7. 《深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存溢出异常

    前言 最近开始看这本书,记得前段时间拿起这本书的时候,心情是相当沉重的!当时的剧本是这样的-- 内景.家里 - 下午 我(画外):唉,有点无聊啊!(偶然撇过书架)这么多书得看到什么时候啊,要不要拿一本 ...

  8. subprocess模块的使用注意

    subprocess.Popen()函数 语法格式: subprocess.Popen(arg,stdin=None,stdout=None,stderr=None,shell=False) 1.主要 ...

  9. 使用flannel+canal实现k8s的NetworkPolicy

    目录 1.NetworkPolicy概述 2.NetworkPolicy策略模型 3.NetworkPolicy默认策略 4.NetworkPolicy的实现 5.使用flannel+canal实现k ...

  10. 使用js对社会信用代码进行正则验证

    注:参考了该博客(https://blog.csdn.net/qq_37142340/article/details/80695187)进行了一些修改,本文验证使用在微信小程序上. 直接贴代码: va ...