zoukankan      html  css  js  c++  java
  • A

      思路等引自博客  https://blog.csdn.net/johnwayne0317/article/details/84928568 

     对数组a[7]:

        a[0]=1;   = d[0]

        a[1]=1;   = d[1]+d[0]

        a[2]=1;   = d[2]+d[1]+d[0]

        a[3]=1;   ..................

        a[4]=1;

        a[5]=1;

        a[6]=1;

        a[7]=1;    =   d[7]+d[6]+d[5]+d[4]+d[3]+d[2]+d[1]+d[0]

        如果要对a[0]~a[4]都加1: 最朴素的方法是:  a[0]++;a[1]++。。。。。时间复杂度为o(n);所以要引入插分数组。

        a[0]=d[0];  d[1]=a[1]-a[0];  d[2]=a[2]-a[1]  d[3]=a[3]-a[2]-a[1];  由此得出以上结论。

        

    如果现在要修改a[0]-a[4],只需要把d[0]+1(所有的a都有d[0]的元素),然后把d[5]-1(a[5]及以后的数字都有d[5]的元素)
    a[0]=d[0]
    a[1]=d[1]+d[0]+1
    a[2]=d[2]+d[1]+d[0]+1
    a[3]=d[3]+…+d[0]+1
    a[4]=d[4]+…+d[0]+1
    a[5]=d[5]-1+…+d[0]+1
    a[6]=d[6]+d[5]-1+…+d[0]+1
    a[5]=d[7]+d[6]+d[5]-1+…+d[0]+1
    差分数组的时间复杂度是O(2) 区间修改就变成了两个单点修改,
        所以呢根据上一段有核心代码:

            for(int i=1;i<=n;i++)
            {
                cin>>a>>b;
                d[a]++;
                d[b+1]--;
            }

        再根据前缀和(因为有上述规律 :   a[3]=d[3]+d[2]+d[1]+d[0])当然本题里没有a[0]哈。

      

            for(int i=2;i<=n;i++)
                d[i]+=d[i-1];

        上题目:

      

    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

     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    ll d[100005];
    int main()
    {
        ll n;
        while(cin>>n)
        {
            if(n==0)
                break;
            memset(d,0,sizeof(d));
            ll a,b;
            for(int i=1;i<=n;i++)
            {
                cin>>a>>b;
                d[a]++;
                d[b+1]--;
            }
            for(int i=2;i<=n;i++)
                d[i]+=d[i-1];
            for(int i=1;i<n;i++)
                printf("%lld ",d[i]);
                printf("%lld
    ",d[n]);
        }
    }
  • 相关阅读:
    VRChat简易教程1-开发环境准备(SDK)
    BeatSaber节奏光剑插件开发官方教程2-简单的插件示例
    BeatSaber节奏光剑插件开发官方教程1-创建一个插件模板
    BeatSaber节奏光剑双手柄MR教程
    第四章 HTML与JavaScript
    第二章数据和判定
    蓝港在线笔试经验
    数据结构总复习(查找)
    数据结构总复习(3)
    数据结构总复习(2)
  • 原文地址:https://www.cnblogs.com/liyexin/p/11014218.html
Copyright © 2011-2022 走看看