题意

如题,已知一个数列,你需要进行下面两种操作:

  1. 将某一个数加上x
  2. 求出某区间每一个数的和

对于100%的数据:N<=500000,M<=500000

分析

cdq分治解决,参照mlystdcall的讲解。

时间复杂度\(O((N+M) \log_2 (N+M))\)

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<typename T>il T read()
{
    rg T data=0,w=1;
    rg char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        data=data*10+ch-'0';
        ch=getchar();
    }
    return data*w;
}
template<typename T>il T read(rg T&x)
{
    return x=read<T>();
}
typedef long long ll;
co int MAXN=5e5+1,MAXM=5e5+1,MAXQ=MAXN+MAXM*2;
struct Query
{
    int type,idx;
    ll val;
    bool operator<(co Query&x)co
    {
        return idx^x.idx?idx<x.idx:type<x.type;
    }
}query[MAXQ],tmp[MAXQ];
ll ans[MAXQ];
int qidx=0,aidx=0;
void cdq(int L,int R) // [L,R)
{
    if(R-L<=1) return;
    int M=(L+R)/2;
    cdq(L,M),cdq(M,R);
    ll sum=0;
    int p=L,q=M,o=0;
    while(p<M&&q<R)
    {
        if(query[p]<query[q])
        {
            if(query[p].type==1) sum+=query[p].val;
            tmp[o++]=query[p++];
        }
        else
        {
            if(query[q].type==2) ans[query[q].val]-=sum;
            else if(query[q].type==3) ans[query[q].val]+=sum;
            tmp[o++]=query[q++];
        }
    }
    while(p<M)
        tmp[o++]=query[p++];
    while(q<R)
    {
        if(query[q].type==2) ans[query[q].val]-=sum;
        else if(query[q].type==3) ans[query[q].val]+=sum;
        tmp[o++]=query[q++];
    }
    std::copy(tmp,tmp+o,query+L);
}
int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    int n=read<int>(),m=read<int>();
    for(int i=1;i<=n;++i)
        query[qidx].idx=i,query[qidx].type=1,query[qidx++].val=read<ll>();
    for(int i=0;i<m;++i)
    {
        read(query[qidx].type);
        if(query[qidx].type==1) read(query[qidx].idx),read(query[qidx++].val);
        else
        {
            int l=read<int>(),r=read<int>();
            query[qidx].idx=l-1,query[qidx++].val=aidx;
            query[qidx].type=3,query[qidx].idx=r,query[qidx++].val=aidx++;
        }
    }
    cdq(0,qidx);
    for(int i=0;i<aidx;++i)
        printf("%lld\n",ans[i]);
    return 0;
}

LG3374 【模板】树状数组 1的更多相关文章

  1. [模板] 树状数组 (C++ class)

    闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...

  2. HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...

  3. 【洛谷 p3374】模板-树状数组 1(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...

  4. 【洛谷 p3368】模板-树状数组 2(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...

  5. POJ2299逆序对模板(树状数组)

    题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...

  6. 洛谷.3374.[模板]树状数组1(CDQ分治)

    题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...

  7. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  8. 洛谷P3368 【模板】树状数组 2

    P3368 [模板]树状数组 2 102通过 206提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 如题,已知一个数列,你需要进行下面两 ...

  9. 洛谷P3374 【模板】树状数组 1

    P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...

  10. poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)

    /* 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! */ #include<iostream> #include<cstring> #include< ...

随机推荐

  1. Mybatis${}、#{}及使用#{}时指定jdbcType

    一.Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${} 我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这 ...

  2. Nginx 配置文件重写

    nginx主配置文件 1.清空过Nginx配置文件,修改: vim /usr/local/nginx/conf/nginx.conf # 以那个账户,账户组来运行nginx user nobody n ...

  3. 网络性能监测工具smokeping

    smokeping简介: smokeping是rrdtool的作者Tobi Oetiker的作品,所以它在图形显示方面有很大优势,也是一个很有特点的opensource工具:多种探测方式,包括fpin ...

  4. Spring_自动装配

    Beans-autowire.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=& ...

  5. Java中如何指定跳出多重嵌套循环

    今天做项目优化涉及到一个跳出指定多重嵌套循环的问题,觉得还是记录一下那么在Java中如何跳出当前的多重嵌套循环? 方法一:可以在需要的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的br ...

  6. D3.js学习笔记(四)—— 使用SVG坐标空间

    目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...

  7. CPU Usage (C#) 测试

    注意:算法仅供参考. cpuusage.cs using System; using System.Collections.Generic; using System.Diagnostics; usi ...

  8. SmsUtils 发送短信

    import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import j ...

  9. IOS-SQLite3

    iOS中的数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding(NSKeyedArchiver\NSk ...

  10. saltstack学习篇

    参考链接:http://sofar.blog.51cto.com/353572/1596960/ http://sofar.blog.51cto.com/353572/1596960/ 自动化运维工具 ...