在一段里同时增加某个数 然后在给定的区间里求和

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<math.h>
using namespace std;
#define N 110000
#define lson rood<<1
#define rson rood<<1|1
int w[N];
struct node
{
    int l,r,mid,len;
    long long v,e;
}a[N<<2];
void q(int rood,int l,int r)
{
    a[rood].l=l;a[rood].r=r;a[rood].mid=(r+l)/2;
    a[rood].e=0;a[rood].len=(r-l+1);
    if(l==r)
    {
        a[rood].v=w[l];
        return ;
    }
    q(lson,l,a[rood].mid);
    q(rson,a[rood].mid+1,r);
    a[rood].v=a[lson].v+a[rson].v;
}
void qq(int rood,int l,int r,int g)
{
    a[rood].v+=(r-l+1)*g;
    if(a[rood].l==l&&a[rood].r==r)
    {
        a[rood].e+=g;
        return ;
    }
    if(a[rood].mid>=r) qq(lson,l,r,g);
    else if(a[rood].mid<l) qq(rson,l,r,g);
    else
    {
        qq(lson,l,a[rood].mid,g);
        qq(rson,a[rood].mid+1,r,g);
    }
}
void Q(int rood)
{
    a[lson].v+=a[lson].len*a[rood].e;
    a[rson].v+=a[rson].len*a[rood].e;
    a[lson].e+=a[rood].e;
    a[rson].e+=a[rood].e;
    a[rood].e=0;
}
long long qqq(int rood,int l,int r)
{
    if(a[rood].l==l&&a[rood].r==r)
        return a[rood].v;
    Q(rood);
    if(a[rood].mid>=r) return qqq(lson,l,r);
    else if(a[rood].mid<l) return qqq(rson,l,r);
    else
    {
        long long x=qqq(lson,l,a[rood].mid);
        long long  y=qqq(rson,a[rood].mid+1,r);
        return x+y;
    }
}
int main()
{
    int n,m,e,f,g;
    char str[12];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        q(1,1,n);
        while(m--)
        {
            scanf("%s%d%d",str,&e,&f);
            if(str[0]==‘Q‘)
            {
                printf("%lld\n",qqq(1,e,f));
                continue;
            }
            scanf("%d",&g);
            qq(1,e,f,g);
        }
    }
    return 0;
}

http://poj.org/problem?id=3468

时间: 2025-02-01 23:45:34

在一段里同时增加某个数 然后在给定的区间里求和的相关文章

HDU 5327 区间里由不同的数字组成的数的个数-set-(枚举)

题意:形如12345是我们要找的数,形如11是不合法的数,找出区间[a~b]里的合法数的个数,1<=a<=b<=10^5 分析:预处理,枚举从1开始到i结束的区间的合法数的个数,然后输入一个区间就输出sum[b]-sum[a-1]即可.这里借助set工具,利用它的count()函数,枚举数i,判定它是否为合法的数,方法是取它的每一位,然后在set里对这一位计数,如果 !=0,说明set里已经有相同的数字了,那么这个数就不合法,否则就插入这一位的数字. STL大法好!要善于运用 代码: #

!HDU 5317 求区间里两个数的质因数个数的gcd的最大值-预处理

题意:设一个数i的质因数个数为F(i),现给你一个区间[l~r],求max(F[i],F[j])  数据范围:10^6 分析: 预处理出所有的F[i],O(nlgn),10^6不会超时:然后查询用O(7),查询不能用O(n),因为有多个查询会超时. 区间问题减少查询时间复杂度多半类似一个区间的和用两个前缀和相减的方式,前缀和可以在预处理的时候计算,然后区间查询是用两个前缀和相减就行了.如sum[l~r]=sum[r]-sum[l-1],再比如之前的什么我想不起来一时,想起来加上. 代码: #in

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target,

在给定的区间上对每个数都开方 最后还是在一段上求和

#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<math.h> using namespace std; #define N 100005 #define lson rood<<1 #define rson rood<<1|1 long long w[N]; st

现在给你N个数(0&lt;N&lt;1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。 第一行给出整数M(0&lt;M&lt;10)代表多少组测试数据 每组测试数据第一行给你N,代表该组测试数据的数量。 接下来的N个数为要测试的数据,每个数小于1000

#include <stdio.h>#include <math.h>int main() { int i,j,N,a=0,n,m,k; int s[1000]; scanf("%d",&N); while(N--) { scanf("%d",&n); for(j=0;j<n;j++) { scanf("%d",&s[j]); if(s[j]==1) s[j]=0; k=sqrt(s[j]);

第五届在线编程大赛月赛第一题:完全平方数的个数

第五届在线编程大赛月赛第一题:完全平方数的个数 题目详情: 给定整数区间[A,B]问其中有多少个完全平方数. 输入格式: 多组数据,包含两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数. 答题说明: 输入样例 1 1 1 2 3 10 3 3 输出样例: 1 1 2 0 java代码: import java.util.Scanner; public class One { public s

#41 最短路(分治+线性基)

考虑异或最短路应该怎么求.那么这是个WC原题,dfs一遍找到所有有用的环丢进线性基即可,因为每一个环的权值都是可以取到且不对其他部分产生影响的. 现在给了一棵树,不妨就把他看做原图的dfs树.每增加一条边就是增加了一个环.算出权值后,现在问题变为求一个数和任选一段区间里的数的最大异或值. 比较暴力的做法是直接建线段树,每次logn*log2v取出区间线性基.这样可以拿50分. 线性基的合并实在太慢了.考虑能不能离线搞.每次取出跨过区间中点的询问,处理中点左右的后缀前缀线性基,询问时将两边线性基合

HDU 5317 RGCDQ

RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 323    Accepted Submission(s): 162 Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more and mo

【BZOJ3784】树上的路径 点分治序+ST表

[BZOJ3784]树上的路径 Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a<b.将这n*(n-1)/2个距离从大到小排序,输出前M个距离值. Input 第一行两个正整数N,M 下面N-1行,每行三个正整数a,b,c(a,b<=N,C<=10000).表示结点a到结点b有一条权值为c的边. Output 共M行,如题所述. Sample Input 5 10 1 2 1