zoukankan      html  css  js  c++  java
  • TZOJ 3198: 区间和

    描述

    给定n个数据,有两个操作,加减其中的一个数据,当然还可查询在某段数据的和。

    输入

    输入数据有多组,每组数据的
    第一行输入n,1=<n<=500000,代表数据的个数。
    第二行输入具体数据,数据为正整数,范围在1到10000.
    第三行输入m,1<=m<=100000,表示操作的次数。包含了修改和查询操作。
    下面m行就是具体的操作了。
    C i x  表示为第i个元素加上x,x范围在1到10000.
    Q i j  表示查询区段i到j的和。保证输入的i<=j.
    以EOF结束。

    输出

    输出查询后的区段和。

    样例输入

    样例输出

    提示

    提示:类型最好定义为__int64
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef int64_t ll;
     4 const int N=500005;
     5 int n;
     6 ll c[N];
     7 int lowbit(int x)
     8 {
     9     return x&-x;
    10 }
    11 ll add(int x,int y)
    12 {
    13     while(x<=n)   //x为下标,二叉树的编号
    14     {
    15         c[x]+=y;
    16         x+=lowbit(x);
    17     }
    18 }
    19 ll sum(int x)
    20 {
    21     ll ans=0;
    22     while(x>0) 
    23     {
    24         ans+=c[x];
    25         x-=lowbit(x);
    26     }
    27     return ans;
    28 }
    29 int main()
    30 {
    31     ios::sync_with_stdio(false);
    32     int d,m;
    33     while(cin>>n)
    34     {
    35         memset(c,0,sizeof(c));
    36         for(int i=1;i<=n;i++)
    37         {
    38             cin>>d;
    39             add(i,d);
    40         }
    41         cin>>m;
    42         while(m--)
    43         {
    44             char s;int a,b;
    45             cin>>s>>a>>b;
    46             if(s=='Q')
    47                 cout << sum(b)-sum(a-1) << endl;
    48             else add(a,b);
    49         }
    50     }
    51     return 0;
    52 }
    View Code

    对原理还不是很懂 天梯赛之后在来研究^-^

  • 相关阅读:
    error :expected initializer before
    数字转字符
    转载转载转载指针占几个字节
    转载转载转载
    二维数组1
    响应式布局
    flex布局
    wepy踩坑经历
    css命名规范(转载)
    28.设计模式
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/10580387.html
Copyright © 2011-2022 走看看