当前位置: 首页 > news >正文

洛谷P2344 奶牛抗议

题目背景

Generic Cow Protests, 2011 Feb

题目描述

约翰家的N 头奶牛正在排队游行抗议。一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为Ai,数字可正可负。

约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几个小组,每个抗议小组的理智度之和必须大于或等于零。奶牛的队伍已经固定了前后顺序,所以不能交换它们的位置,所以分在一个小组里的奶牛必须是连续位置的。除此之外,分组多少组,每组分多少奶牛,都没有限制。

约翰想知道有多少种分组的方案,由于答案可能很大,只要输出答案除以1000000009 的余数即可。

输入输出格式

输入格式:

 

• 第一行:单个整数N,1 ≤ N ≤ 100000

• 第二行到第N + 1 行:第i + 1 行有一个整数Ai,−10^5 ≤ Ai ≤ 10^5

 

输出格式:

 

单个整数:表示分组方案数模1000000009 的余数

 

输入输出样例

输入样例#1:
4
2
3
-3
1
输出样例#1:
4

说明

解释:如果分两组,可以把前三头分在一组,或把后三头分在一组;如果分三组,可以把中间两头分在一组,第一和最后一头奶牛自成一组;最后一种分法是把四头奶牛分在同一组里。

分析:求方案数的解决方法可以用数学方法和dp,这道题我找不出数学数学方法来,只能dp.本来我的状态考虑为f[i][j]表示前j头牛分i组,可是这个i并不确定,而且O(n^3)的dp,直接超时了,那么我们去掉这一维,f[i]表示前i头牛的分组,f[i]=∑f[j](a[j] + a[j + 1] +...+a[i] >= 0),转换成前缀和就是s[j] <= s[i],那么怎么找j < i并且s[j] <= s[i]的数呢?当然是树状数组啦!但是由于s可能过大,需要先离散化一下.

dp中如果状态中的一维不能确定,可以省去这一维,通常可以用树状数组优化满足两个条件i<j&&s[i]<s[j]的题,数据太大需要离散化.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int mod = 1000000009;

int n,cnt = 1,ans,c[100010];

struct node
{
     int a,id,newid;    
}e[100010];

bool cmp(node a,node b)
{
    return a.a < b.a;
}

bool cmp2(node a,node b)
{
    return a.id < b.id;
}

void add(int x,int d)
{
    while (x <= cnt)
    {
        c[x] = (c[x] + d) % mod;
        x += x & (-x);
    }
}

int query(int x)
{
    int res = 0;
    while (x)
    {
        res = (res + c[x]) % mod;
        x -= x & (-x);
    }
    return res;
}

int main()
{
    scanf("%d",&n);
    e[0].a = 0;
    e[0].id = 0;
    for (int i = 1;i <= n; i++)
    {
    int t;
    scanf("%d",&t);
    e[i].a = e[i-1].a + t; 
    e[i].id = i;
    }
    sort(e,e + 1 + n,cmp);
    e[0].newid = 1;
    for (int i = 1; i <= n; i++)
    {
        if (e[i].a != e[i-1].a)
        e[i].newid = ++cnt;
        else
        e[i].newid = cnt;
    }
    sort(e,e + 1 + n,cmp2);
    add(e[0].newid,1);
    for (int i = 1; i <= n; i++)
    {
        ans = query(e[i].newid);
        add(e[i].newid,ans);
    }
    printf("%d\n",ans);

    return 0;
}

 

转载于:https://www.cnblogs.com/zbtrs/p/7507395.html

相关文章:

  • python归档:笔记转化
  • 理解JS中的call、apply、bind方法
  • Number Math
  • 初学JAVA的变量作用域
  • Inno Setup自定义安装界面脚本
  • Spring AOP简单的配置(注解和xml配置)
  • Swift,枚举
  • java操作Excel
  • 'NoneType' object is not iterable
  • AngularJS
  • C++ 清空队列(queue)的几种方法
  • MIME 类型(HttpContext.Response.ContentType)列表
  • 从微信官方获取微信公众号名片:https://open.weixin.qq.com/qr/code?username=haihongruanjian...
  • 分享 - 27 个机器学习、数学、Python 速查表
  • 浅析设计模式
  • 2017届校招提前批面试回顾
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • gitlab-ci配置详解(一)
  • JS专题之继承
  • MySQL用户中的%到底包不包括localhost?
  • rc-form之最单纯情况
  • React的组件模式
  • Terraform入门 - 3. 变更基础设施
  • Twitter赢在开放,三年创造奇迹
  • underscore源码剖析之整体架构
  • yii2权限控制rbac之rule详细讲解
  • 服务器从安装到部署全过程(二)
  • 关于字符编码你应该知道的事情
  • 开发基于以太坊智能合约的DApp
  • 聊一聊前端的监控
  • 前端面试之闭包
  • 一个完整Java Web项目背后的密码
  • 运行时添加log4j2的appender
  • Hibernate主键生成策略及选择
  • ionic入门之数据绑定显示-1
  • 如何正确理解,内页权重高于首页?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #includecmath
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $$$$GB2312-80区位编码表$$$$
  • ${factoryList }后面有空格不影响
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (5)STL算法之复制
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (NSDate) 时间 (time )比较
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (三)模仿学习-Action数据的模仿
  • (十六)串口UART
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)Linq学习笔记
  • (转)scrum常见工具列表