zoukankan      html  css  js  c++  java
  • NKOI 1321--数列操作问题(裸BIT)

    数列操作问题

    Time Limit:10000MS  Memory Limit:65536K
    Total Submit:276 Accepted:149 
    Case Time Limit:1000MS

    Description

    假设有一列数{Ai}(1≤i≤n),支持如下两种操作: 
    将Ak的值加D。(k, D是输入的数) 
    输出As+As+1+…+At。(s, t都是输入的数,S≤T)

    Input

    第一行一个整数n, 
    第二行为n个整数,表示{Ai}的初始值≤10000。 
    第三行为一个整数m,表示操作数 
    下接m行,每行描述一个操作,有如下两种情况: 
    ADD k d (表示将Ak加d,1<=k<=n,d为数,d的绝对值不超过10000) 
    SUM s t (表示输出As+…+At) 

    Output

    对于每一个SUM提问,输出结果

    Sample Input

    5 
    1 2 3 2 4 
    5 
    SUM 1 2
    SUM 1 5
    ADD 1 2
    SUM 1 2
    SUM 1 5

    Sample Output

    3 
    12 
    5 
    14 

    Hint

    M,N<=100000

    Source

    解题思路:

      模板题

    代码:

    # include<cstdio>
    # include<iostream>
    # include<fstream>
    # include<algorithm>
    # include<functional>
    # include<cstring>
    # include<string>
    # include<cstdlib>
    # include<iomanip>
    # include<numeric>
    # include<cctype>
    # include<cmath>
    # include<ctime>
    # include<queue>
    # include<stack>
    # include<list>
    # include<set>
    # include<map>
    
    using namespace std;
    
    const double PI=4.0*atan(1.0);
    
    typedef long long LL;
    typedef unsigned long long ULL;
    
    # define inf 999999999
    # define MAX 100000+4
    
    int n;
    int a[MAX];
    int tree[MAX];//树状数组
    char s[23];
    
    int read ( int pos )
    {
        int temp = 0;
        for ( int j = pos;j;j-=j&(-j) )
        {
            temp+=tree[j];
        }
        return temp;
    }
    
    void update( int pos,int val )
    {
        for ( int j = pos;j <= n;j+=j&(-j) )
        {
            tree[j]+=val;
        }
    }
    
    int main(void)
    {
        char c;
        scanf("%d",&n);
        for ( int i = 1;i <= n;i++ )
        {
            scanf("%d",&a[i]);
        }
        for ( int i = 1;i <= n;i++ )
        {
            update(i,a[i]);
        }
        int m;scanf("%d
    ",&m);
        for ( int i = 0;i < m;i++ )
        {
            int x,y;
            int ans1 = 0;
            int ans2 = 0;
            scanf("%s",s);
            scanf("%d",&x);
            scanf("%d",&y);
            //cout<<x<<" "<<y<<endl;
            if ( s[0] == 'S' )
            {
                ans1 = read(y);
                ans2 = read(x-1);
                printf("%d
    ",ans1-ans2);
            }
            else if ( s[0] == 'A' )
            {
                update(x,y);
            }
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    团队作业2
    神琪宝贝
    自我介绍
    新博客破蛋日!
    关于mysql的索引原理与慢查询优化
    mysql主从复制(超简单)
    MySQL 主从复制与读写分离概念及架构分析
    nginx配置image_filter生成缩略图
    关于ueditor多图上传加水印
    linux下php调用root权限实现方案
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4394420.html
Copyright © 2011-2022 走看看