poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》
地址 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 线段树 题解《挑战程序设计竞赛》的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- POJ 3468 A Simple Problem with Integers //线段树的成段更新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 59046 ...
- poj 3468 A Simple Problem with Integers 线段树加延迟标记
A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal ...
- poj 3468 A Simple Problem with Integers 线段树区间更新
id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072 ...
随机推荐
- js (单个的)点击式下拉菜单
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 易优CMS:switch的基础用法
[基础用法] 名称:switch 功能:简单条件判断,比if判断标签少些不等于相同功能,视个人习惯而用. 语法: {eyou:switch name='$eyou.field.has_children ...
- JDK性能分析与故障处理-命令行
一.命令演示登录主机:21docker ps -a | grep 'hub.ecs.com:6999/open_pro.*open-pro-apple2'docker exec -it ID /bin ...
- 字典 dict方法
字典 student = {'sId': '1101', 'sName': '张三', 'sClass': '软件测试', 'sColl': '信息技术学院'} # 根据键查询 若不存在会报错 pri ...
- Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above. Suggestion: disable configuration on demand by setting org
androidStudio打开cocos3.17.2Lua项目时,出现了 Configuration on demand is not supported by the current version ...
- 在windows上用apache+mod_wsgi服务部署django项目
之前一直在本地跑django项目,最近尝试在服务器上部署项目,目前已经成功部署,也花了好多时间,这里跟大家交流一下,希望对像我一样的新手有帮助. 一.配置环境: 1.Python版本3.7 2.服务器 ...
- Flask中获取参数(路径,查询,请求体,请求头)
上一篇中已经讲述了:HTTP协议向服务器传参有几种途径{ 链接 } 在Flask中同样通过这4中传参途径进行归纳: 1. URL中路径参数的获取: 拓展: # 路由参数/路径参数:http://127 ...
- docker jenkins安装
https://hub.docker.com/r/jenkins/jenkins jenkins的docker官方镜像地址 https://jenkins.io/ jenkins官方网站 环境: 阿里 ...
- Ubuntu16.04VIM无法补全错误记录
先记录一下YouCompleteMe的安装过程. 按照教程进行安装 1. 安装 vundle # vundle是vim的包管理器,十分好用 cv@cv: ~$ git clone https://gi ...
- 01-Nginx安装
一.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel 二.首先安装PCRE PC ...