地址 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. git clone 仓库的部分代码

    对于较大的代码仓库来说,如果只是想查看和学习其中部分源代码,选择性地下载部分路径中的代码就显得很实用了,这样可以节省大量等待时间. 比如像 Chromium 这种,仓库大小好几 G 的. clone ...

  2. LinqDB 查询数据库

    LinqDB数据库查询数据,还是很方便的. 1. 添加Entity数据实体类 方便之后映射操作 /// <summary> /// 课件 /// </summary> [Dat ...

  3. 安装指定版本的tensorflow(我报错了)

    安装命令如下: pip install tensorflow-gpu==1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 慎用,反正我报错了,而且还 ...

  4. JavaScript定时器(Timer)

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://www.cnblogs.com/gaoguowen/p/11119088.html 什么是定时器 简单来说就是在一段时间间隔后执行一 ...

  5. console 有没有小伙伴跟我一样想知道这个对象呢

    晚上看了会代码,没什么简单又好分享的 -0- 突然想到console这个对象,就把它打印了出来看看吧 ; for(var key in console){ i++; ){ document.write ...

  6. MAT分析android内存泄漏

    转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...

  7. SpringCloudGateWay修改请求路径,从注册中心获得服务

    SpringCloudGateWay修改请求路径,从注册中心获得服务 @Resource    private DiscoveryClient disClient;    @Resource    p ...

  8. unittest---unittest中verbosity参数设置

    我们在做自动化测试的时候,有时候想要很清楚的看到每条用例执行的详细信息,我们可以通过unittest中verbosity参数进行设置 verbosity参数设置 verbosity表示在只执行用例的过 ...

  9. Flask的session

    ### session:1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息.不同的是,cookie是存储在本地浏览器,session是一个思路.一个 ...

  10. linux的装配与虚拟机的快照

    一.科普 1969年,“c语言之父”,“b语言之父”,ken Thompson,开发了一个叫unics系统,是unix系统的雏形,只不过此时的UNICS是用汇编语言写的.移植到其它计算机上需要改很多源 ...