• 前缀和,积,后缀和,积


    前缀和,积,后缀和,积

    定义两个数组a[n],b[n]

    前缀和

    b[i]=a[0]+a[1]+…+a[i-1]+a[i];
    例题:hdu1156

    Color the ball

    Problem Description

    N个气球排成一排,从左到右依次编号为1,2,3…N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?

    Input

    每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
    当N = 0,输入结束。

    Output

    每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。

    Sample Input

    3
    1 1
    2 2
    3 3
    3
    1 1
    1 2
    1 3
    0

    Sample Output

    1 1 1
    3 2 1
    先来说一下简单,暴力的思路
    开一个x[10001]的数组(初始化为0),每组数据,n次循环,每次把x[a]~x[b]的变量+1;显然这样简单粗暴的方法会导致时间超限

    所以只能换思路
    例:N=4
    第一组数据输入了1 4
    就把x[1]++,x[4+1]–;
    然后x[n]=x[n]+x[n-1];
    就相当于循环把1,4内的数在数组里标了1

    一次输入的思路
    N=4
    输入
    1 4
    2 3
    2 4
    3 4
    用下图来表示思路
    多次输入的思路
    所以结果是,输出1 3 4 3
    最后上代码

    #include <stdio.h>
    int main()
    {
        int n;
        while(scanf("%d",&n),n)
        {
            int x[100001]={0},i;
            for(i=0;i<n;i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                x[a]++;
                x[b+1]--;
            }
            for(i=1;i<n;i++)
                printf("%d ",x[i]=x[i-1]+x[i]);
            printf("%d
    ",x[n]=x[n-1]+x[n]);
        }
        return 0;
    }

    后缀和

    b[i]=a[i]+a[i+1]+…+a[n-2]+a[n-1];

    前缀积

    b[i]=a[0] * a[1] *…*a[i-1]*a[i];

    后缀积

    b[i]=a[i] * a[i+1 ]*…*a[n-2]*a[n-1];

  • 相关阅读:
    序列化模块
    验证码作业
    Red Hat Enterprise Linux 6安装好,开启网卡到搭建tftp服务器和安装dnw驱动,安装samba服务器
    3.Java基础_Java变量
    2.Java基础_Java常量
    1.Java基础_Java核心机制简介
    1.Python网络编程_UDP(简略版)
    3.Python爬虫入门_正则表达式(简单例子)
    2.Python爬虫入门_requests
    1.Python爬虫入门_urllib
  • 原文地址:https://www.cnblogs.com/yanhua-tj/p/13996588.html
Copyright © 2020-2023  润新知