zoukankan      html  css  js  c++  java
  • CDOJ 838 母仪天下 树状数组 (2014数据结构专题

    母仪天下

    Time Limit: 1 Sec  Memory Limit: 162 MB

    题目连接

    http://acm.uestc.edu.cn/#/problem/show/838

    Description

    富庶的建业城中,有一条格格不入的长街,名曰跳蚤街,被战争所致的孤儿,聚集于此。全国的经济都在为战争服务之时,也无人顾得了这里了。

    除了两位夫人。

    大乔小乔每天都会带着一些食物来到跳蚤街,分给某一位孩子。为了避免分配不均,她们时常会询问一个区域内食物的总量,然后进行调整以保证每个孩子都有足够的食物。

    Input

    第一行两个整数n,m,表示跳蚤街住着n户孩子,大乔小乔一共分发或询问了m次。

    第二行n个整数,第i个数ai表示第i户孩子已有ai的食物。

    接下来m行,每行开始先读入一个整数si,指明这是一次询问还是一次分发。

    si=0,表明这是一次询问,然后读入两个整数li,ri,表示询问[li,ri]区间中的孩子们一共有多少食物。

    si=1,表明这是一次分发,然后读入两个整数xi,wi,表示对第xi户孩子分发了wi的食物。

    1≤n,m≤100000,0≤ai≤100000,1≤xi≤n,0≤wi≤10000,1≤li≤ri≤n

    1n,m100000,0ai100000,1xin,0wi10000,1lirin

    Output

    有多少询问就输出多少行,每行输出一个整数,作为对该询问的回答。

    Sample Input

    5 4
    1 2 3 4 5
    1 2 3
    0 2 4
    1 4 1
    0 1 5

    Sample Output

    12 19

    HINT

    题解:

    啊,裸的线段树或者树状数组,乱搞就好啦

    加了输入输出挂,结果和scanf的速度一样……

    代码:

    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<map>
    #include<stack>
    using namespace std;
    #define maxn 100005
    inline long long read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int buf[10];
    inline void write(int i) {
      int p = 0;if(i == 0) p++;
      else while(i) {buf[p++] = i % 10;i /= 10;}
      for(int j = p-1; j >=0; j--) putchar('0' + buf[j]);
      printf("
    ");
    }
    int lowbit(int x)
    {
        return x&(-x);
    }
    int n,m;
    int a[maxn];
    void add(int x,int y)
    {
        while(x<=n)
        {
            a[x]+=y;
            x+=lowbit(x);
        }
    }
    int sum(int x)
    {
        int s=0;
        while(x>0)
        {
            s+=a[x];
            x-=lowbit(x);
        }
        return s;
    }
    
    int main()
    {
        n=read(),m=read();
        for(int i=1;i<=n;i++)
        {
            int x=read();
            add(i,x);
        }
        for(int i=0;i<m;i++)
        {
            int x=read();
            if(x==0)
            {
                int c=read(),d=read();
                write(sum(d)-sum(c-1));
            }
            else
            {
                int c=read(),d=read();
                add(c,d);
            }
        }
        return 0;
    }
  • 相关阅读:
    [转]tesseract api C++使用例子
    Flyway记录
    线程安全性和共享
    并发初解
    生产环境中遇到过什么问题?或者有没有自己解决什么问题比较自豪的
    Java白皮书关键词理解【随记】
    技术面试记录
    Mac下完全卸载IntelliJIdea
    docker提交镜像后运行新容器mysql无法启动
    IntelliJ IDEA切换SDK解决卡顿的问题
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4383547.html
Copyright © 2011-2022 走看看