洛谷P3374 【模板】树状数组 1(CDQ分治)
时间:2022-05-08
本文章向大家介绍洛谷P3374 【模板】树状数组 1(CDQ分治),主要内容包括题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某一个数加上x
2.求出某区间每一个数的和
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3个整数,表示一个操作,具体如下:
操作1: 格式:1 x k 含义:将第x个数加上k
操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
输入样例#1:
5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
输出样例#1:
14
16
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
样例说明:
故输出结果14、16
CDQ分治维护二维偏序
第一维用排序搞掉
第二维用CDQ分治
慢的要死。。
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<ctime>
5 #include<cstdlib>
6 using namespace std;
7 #define ls T[now].ch[0]
8 #define rs T[now].ch[1]
9 const int MAXN=2*1e6+10;
10 inline char nc()
11 {
12 static char buf[MAXN],*p1=buf,*p2=buf;
13 return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
14 }
15 inline int read()
16 {
17 char c=nc();int x=0,f=1;
18 while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
19 while(c>='0'&&c<='9'){x=x*10+c-'0',c=nc();}
20 return x*f;
21 }
22 int n,m;
23 struct node
24 {
25 int idx;//第几次询问
26 int val;//修改的值
27 int type;//操作类型
28 bool operator<( const node &a) const {
29 return idx==a.idx?type<a.type:idx<a.idx;}
30 }Q[MAXN];
31 int qidx=0;//操作的个数
32 int aidx=0;//询问的个数
33 int ans[MAXN];
34 node tmp[MAXN];
35 void CDQ(int l,int r)
36 {
37 if(r-l<=1) return ;
38 int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid,r);
39 int sum=0;
40 int p=l,q=mid,o=0;
41 while(p<mid&&q<r)
42 {
43 if(Q[p]<Q[q])
44 {
45 if(Q[p].type==1) sum+=Q[p].val;
46 tmp[o++]=Q[p++];
47 }
48 else
49 {
50 if( Q[q].type==2) ans[Q[q].val]-=sum;
51 else if(Q[q].type==3) ans[Q[q].val]+=sum;
52 tmp[o++]=Q[q++];
53 }
54 }
55 while(p<mid) tmp[o++]=Q[p++];
56 while(q<r)
57 {
58 if( Q[q].type==2) ans[Q[q].val]-=sum;
59 else if(Q[q].type==3) ans[Q[q].val]+=sum;
60 tmp[o++]=Q[q++];
61 }
62 for(int i=0;i<o;i++) Q[i+l]=tmp[i];
63 }
64 int main()
65 {
66 #ifdef WIN32
67 freopen("a.in","r",stdin);
68 #else
69 #endif
70 n=read();m=read();
71 for(int i=1;i<=n;i++)
72 {
73 Q[qidx].idx=i;
74 Q[qidx].type=1;
75 Q[qidx].val=read();++qidx;
76 }
77 for(int i=0;i<m;i++)
78 {
79 int type=read();
80 Q[qidx].type=type;
81 if(type==1) Q[qidx].idx=read(),Q[qidx].val=read();
82 else
83 {
84 int l=read(),r=read();
85 Q[qidx].idx=l-1;Q[qidx].val=aidx;++qidx;
86 Q[qidx].type=3;Q[qidx].idx=r;Q[qidx].val=aidx;aidx++;
87 }
88 ++qidx;
89 }
90 CDQ(0,qidx);
91 for(int i=0;i<aidx;i++) printf("%dn",ans[i]);
92 return 0;
93 }
- SQL练习之两个列值的交换
- Parcel,零配置开发 React 应用!
- 像 React Native 开发 APP 一样,用wn-cli 开发 weapp (微信小程序)
- 正则表达式快速入门
- JavaScript之<script>标签简介
- 数控机床数控系统选择4大关键要素
- Python快速入门
- Jquer学习之jQuery(function(){})与(function(){})(jQuery)之间的区别
- 服务端常见性能隐患分享
- ExtJs学习笔记(19)_复杂Form示例
- Linux快速入门01-基础概念
- SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)
- 对php多态的理解
- JavaScript值延迟脚本和异步脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法