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

线段树模板

要背下此模板

线段树

 #include <iostream>
#include <vector>
#include <math.h>
#include <algorithm> using namespace std; /*
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
*/
typedef long long ll; const int DAT_SIZE = ( << ) - ; const int MAX_N = ; //输入
int N, Q;
int A[MAX_N];
char T[MAX_N];
int L[MAX_N], R[MAX_N], X[MAX_N]; //线段树
ll dat_a[DAT_SIZE], dat_b[DAT_SIZE]; //对区间[a,b]同时加x
//k是节点的编号 对应的空间是[l,r)
void add(int a, int b, int x, int k, int l, int r)
{
if (a <= l && r <= b) {
dat_a[k] += x;
}
else if (l < b && a < r) {
dat_b[k] += (min(b,r)-max(a,l))* x;
add(a, b, x, k * + , l, (l + r) / );
add(a, b, x, k * + , (l + r) / , r);
}
} //计算[a,b)的和
//k是节点的编号 对应的区间是[l,r)
ll sum(int a, int b, int k, int l, int r)
{
if (b <= l || r <= a) {
return ;
}
else if(a <= l && r <= b){
return dat_a[k] * (r - l) + dat_b[k];
}
else {
ll res = (min(b,r)-max(a,l)) * dat_a[k];
res += sum(a, b, k * + , l, (l + r) / );
res += sum(a, b, k * + , (l + r) / , r);
return res;
}
} void solve()
{
for (int i = ; i < N; i++) {
add(i, i + , A[i], , , N);
}
for (int i = ; i < Q; i++) {
if (T[i] == 'C') {
add(L[i]-, R[i] , X[i], , , N);
}
else {
printf("%lld\n",sum(L[i]-,R[i],,,N));
}
}
} int main()
{
cin >> N >> Q; for (int i = ; i < N; i++) {
cin >> A[i];
} for (int i = ; i < Q; i++) {
cin >> T[i];
if (T[i] == 'C')
cin >> L[i] >> R[i] >> X[i];
else
cin >> L[i] >> R[i];
} solve(); return ;
}

 #include <iostream>
#include <vector> using namespace std; /*
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
*/ typedef long long ll; int n, m; const int MAX_N = ;
int input[MAX_N]; struct Node {
int l, r;
ll data;
}; struct Node stree[MAX_N * ]; void build(int idx, int l, int r)
{
stree[idx].l = l;
stree[idx].r = r;
if (l == r) {
//叶子节点
stree[idx].data = input[l];
return;
} int mid = (l + r) / ;
build(idx * , l,mid);
build(idx * + , mid + , r); stree[idx].data = stree[idx * ].data + stree[idx * + ].data;
} ll query(int idx, int start, int end, int l, int r)
{
if (l == stree[idx].l && r == stree[idx].r) {
return stree[idx].data;
} int mid = (start + end) / ;
if (l <= mid && r <= mid) {
return query(idx * , start, mid, l, r);
}
else if (l > mid && r > mid) {
return query(idx * + , mid + , end, l, r);
}
else {
ll res = ;
res += query(idx * , start, mid, l, mid);
res += query(idx * + , mid + , end, mid + , r);
return res;
} } void add(int idx, int l, int r, int v)
{
if (l == r && stree[idx].l == stree[idx].r && stree[idx].l == l) {
//叶子节点
stree[idx].data += v;
return;
} int mid = (stree[idx].l + stree[idx].r) / ;
if (l <= mid && r <= mid) {
add(idx * , l, r,v);
}
else if (l > mid && r > mid) {
add(idx * + , l, r,v);
}
else {
add(idx * , l, mid, v);
add(idx * + , mid+, r, v);
} stree[idx].data = stree[idx*].data + stree[idx*+].data;
} int main()
{
int n, m;
cin >> n >> m;
for (int i = ; i <= n; i++) {
cin >> input[i];
} build(, , n); for (int i = ; i < m; i++) {
char t;
int l, r, v;
cin >> t;
if (t == 'C') {
cin >> l >> r >> v;
add(, l, r, v);
}
else if (t == 'Q') {
cin >> l >> r;
cout << query(, , n, l, r) << endl;
}
} return ;
}

自写TLE代码

poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》的更多相关文章

  1. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  2. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  3. poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解

    A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...

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

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  5. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  6. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  7. POJ 3468 A Simple Problem with Integers //线段树的成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 59046   ...

  8. poj 3468 A Simple Problem with Integers 线段树加延迟标记

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  9. poj 3468 A Simple Problem with Integers 线段树区间更新

    id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072 ...

随机推荐

  1. Python程序设计 测验易错题总结

    1.温度转换 t=input() if t[-1]=="J": t=int(t[:-1]) t1=t/4.186 print("%.3fcal"%t1) els ...

  2. vue解惑之v-on(事件监听指令)

    一.v-on指令 vue中用v-on指令来监听DOM事件,并触发相应的代码.比如v-on:click,表示监听了点击事件. 二.事件修饰符 在事件处理函数中调用 event.preventDefaul ...

  3. JS基础语法---String对象下的方法(字符串的方法)

    实例方法---->必须要通过new的方式创建的对象(实例对象)来调用的方法 静态方法---->直接通过大写的构造函数的名字调用的方法(直接通过大写的对象名字调用的) 字符串的常用属性: . ...

  4. 使用Data Guard迁移到RAC (Doc ID 273015.1)

    Migrating to RAC using Data Guard (Doc ID 273015.1) APPLIES TO: Oracle Database Cloud Exadata Servic ...

  5. IDEA 工具自动生成JavaBean类

    1.先安装GsonFormat插件:File-->Setting-->Plugins-->GsonFormat-->OK 2.new 一个新的Class空文件,然后 Alt+I ...

  6. Linux系统学习 十、DHCP服务器—介绍和原理

    介绍: DHCP服务作用(动态主机配置协议) 为大量客户机自动分配地址.提供几种管理 减轻管理和维护成本.提高网络配置效率 可分配的地址信息主要包括: 网卡的IP地址.子网掩码 对应的网路地址.广播地 ...

  7. gunicorn Python部署应用

    对于flask应用 启动命令为 python app.py 使用gunicorn启动 pip install gunicorn python gunicorn --workers=7 switch_a ...

  8. layui多个时间选择器出现闪退问题

    1.出现问题的代码 laydate.render({ elem: '#startDate' // }); laydate.render({ elem: '#endDate' // }); laydat ...

  9. 数据库语言-SQL

    SQL语言的功能概述 DDL语句引导词:Create(建立),Alter(修改),Drop(撤销) DML语句引导词:Insert,Delete,Update,Select DCL语句引导词:Gran ...

  10. 2019-2020-1 20199305《Linux内核原理与分析》第十二周作业

    缓冲区溢出漏洞实验 (一)何为缓冲区溢出漏洞 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于 ...