序列的区间操作

知识点

这是一个比较零碎的小点,之前并不知道,只会暴力233333
一个数组\(a\)(假设数组长为\(a\)),然后数组\(a\)的下标在\([l,r]\)范围内元素加上/减去一个数\(x\),可以这样操作:

\(a[l]=a[l]+n;a[r+1]=a[r+1]-n\)

求操作后的\(a[k]\)即为:

\(a[k]=\sum_{i=0}^{k}a[i]\)

相关题目

eg1:HDU 1556 Color the ball (原题戳我~)

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 <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
typedef long long ll;

const int maxn = 100000 + 10;
int ball[maxn];

int main()
{
    int n;
    while (cin >> n)
    {
        if (n == 0)
            break;
        memset(ball, 0, sizeof(ball));
        for (int i = 0; i < n; i++)
        {
            int a, b;
            cin >> a >> b;
            ball[a]++;
            ball[b + 1]--;
        }
        for (int i = 1; i <= n; i++)
        {
            ball[i] += ball[i - 1];
            if (i < n)
                cout << ball[i] << " ";
            else
            {
                cout << ball[i] << endl;
            }
        }
    }
    // system("pause");
    return 0;
}

完~

posted @ 2019-10-29 16:34  cafu-chino  阅读(212)  评论(0编辑  收藏  举报