zoukankan      html  css  js  c++  java
  • 子数列连续和

    问题 A: 子数列连续和

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 25  解决: 16
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    给定n个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和。数列的元素个数最多10万个,询问操作最多10万次。

    输入

    第一行2个整数n,m(n表示输入n个数,m表示有m个操作)
    第二行输入n个数列。
    接下来m行,每行有三个数k,a,b(k=0表示求子数列[a,b]的和;k=1表示第a个数加b)。

    输出

    输出若干行数字,表示k=0时,对应的子数列[a,b]的连续和。

    样例输入

    10 5
    1 2 3 4 5 6 7 8 9 10
    1 1 5
    0 1 3
    0 4 8
    1 7 5
    0 4 8
    

    样例输出

    11
    30
    35
    #include<bits/stdc++.h>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<iostream>
    #define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
    #define REP(j, a, b) for(int j = (a); j <= (b); ++ j)
    #define PER(i, a, b) for(int i = (a); i >= (b); -- i)
    using namespace std;
    const int maxn = 1e7 + 5;
    int n, k,p[maxn],m,x;
    int lowbit(int a) {
        return a & (-a);
    }
    void add(int pos,int w) {
        while (pos <= n) {
            p[pos] += w, pos += lowbit(pos);
        }
    }
    int sum(int pos) {
        int tot=0;
        while (pos) {
            tot += p[pos];
            pos -= lowbit(pos);
        }
        return tot;
    }
    int main(){
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            cin >> x;
            add(i, x);
        }
        while (m--) {
            int x, u, v;
            cin >> x >> u >> v;
            if (x) {
                add(u, v);
            }
            else {
                cout << sum(v) - sum(u - 1) << endl;
            }
        }
    }
  • 相关阅读:
    Mac Python相关配置操作汇总
    暑假算法练习Day2
    暑假算法练习Day1
    《Min_25筛》
    《Yuchang and Zixiang’s stones》
    《Codeforces Round #732 (Div. 1)》
    《P7842 「PMOI-4」可怜的团主》
    《Codeforces Round #739 (Div. 3)》
    《斜率dp》
    《凸包》
  • 原文地址:https://www.cnblogs.com/czy-power/p/10357688.html
Copyright © 2011-2022 走看看