XDOJ_1013_线段更新求和

http://acm.xidian.edu.cn/problem.php?id=1013

好像树状数组和线段树都可以做,但是不会= =。

直接保存了左右点,记录每次加减的总和,最后更新到原来的高度里就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int a[100005],sum[100005];

int main()
{
    int n,m,l,r,k;
    while(~scanf("%d",&n))
    {
        long long summ = 0;
        memset(sum,0,sizeof(sum));
        for(int i = 1;i <= n;i++)    scanf("%d",&a[i]);
        scanf("%d",&m);
        for(int i = 1;i <= m;i++)
        {
            scanf("%d%d%d",&l,&r,&k);
            sum[l+1] -= k;
            sum[r+1] += k;
        }
        for(int i = 1;i <= n;i++)
        {
            sum[i] += sum[i-1];
            a[i] += sum[i];
            summ += a[i];
        }
        int ave = summ/n;
        for(int i = 1;i <= n;i++)    a[i] -= ave;
        summ = 0;
        for(int i = 1;i <= n;i++)    summ += (long long)a[i]*a[i];
        printf("%lld\n",summ);
    }
    return 0;
}
时间: 2024-10-10 00:58:26

XDOJ_1013_线段更新求和的相关文章

PKU A Simple Problem with Integers (线段树区间更新求和)

题意:典型的线段树C,Q问题,有n个数a[i] (1~n),C, a, b,c在[a,b]区间增加c Q a b 求[a,b]的和. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream> #include <queue> #i

HDU 1166 敌兵布阵 线段树单点更新求和

题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 50005 using namespace std; int data[N]; struct Tree { int l,r,sum; }tree[N*4]; void bui

FZU1608 Huge Mission 线段树lazy区间更新+求和

就这破题目坑了我一个大晚上,直到今天一觉醒过来才搞定,原因之一:这题目的题意真的是太狗了,还不如直接看着案例猜来的快啊, 题意:给了你一些区间,x,y,第三个参数w是效率,代表这段时间他的单位时间效率,效率总和就是 (y-x)*w,然后有的时间段会被重复啊,比如前面给了1,4,1,后面又给了2,4,3他们为了是的时间段1,4的效率总和最大肯定是选择  2,4区间的效率值选择3,意思就是后面出现更好的情况就覆盖前面的,问你总得最大效率和 当然这题目坑的原因还有一个就是以前学习线段树 做的时候都是看

HRBUST 1161 树状数组区间更新求和

Leyni Time Limit: 3000 MS Memory Limit: 65536 K Total Submit: 267(64 users) Total Accepted: 82(57 users) Rating: Special Judge: No Description Leyni被人掳走,身在水深火热之中... 小奈叶为了拯救Leyni,独自一人前往森林深处从静竹手中夺回昏迷中的Leyni. 历经千辛万苦,小奈叶救出了Leyni,但是静竹为此极为恼怒,决定对他们发起最强烈的进攻.

poj3511--A Simple Problem with Integers(线段树求和)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 60441   Accepted: 18421 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of

HDU 1689 Just a Hook 线段树区间更新求和

点击打开链接 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18894    Accepted Submission(s): 9483 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible

[POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]

A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of

线段树区间更新&amp;&amp;求和poj3486

给出了一个序列,你需要处理如下两种询问. "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000). "Q a b" 询问[a, b]区间中所有值的和. Input 第一行包含两个整数N, Q.1 ≤ N,Q ≤ 100000. 第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000). 接下来Q行询问, Sample Input 10 5 1 2 3 4 5 6 7 8 9 10

线段树之单点更新求和hdoj1166

题目:hdoj1166 分析:题意很清晰,就是让你给某个点又增加或者减少x个,然后求某一段有多少个,我是用一个father数组保存叶子节点的编号,然后直接从当前节点开始,更轻到root就ok. 查询的话,从根节点开始,看在左子区间还是右子区间,直接查询到某一段全部在要查询的区间内,求和就ok,很简单. 代码: #include <cstdio> #include <string> #include <iostream> using namespace std; cons