线段树的TLE代码(pku 3468)

songzhipeng08 songzhipeng08 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
试题链接:
http://124.205.79.250/JudgeOnline/problem?id=3468
问题:
下面的代码是我花了一上午的时间打出来的(好吧,欢迎鄙视本菜^_^),不明白为什么会超时,我觉得我的add和query函数都是O(logN)的复杂度呀(估计不是,否则不会超时了……),请各位大牛看看为什么会超时(帮忙分析一下时间复杂度),谢谢。
代码:

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <cctype>
#include <set>
#include <map>
#include <bitset>
#include <stack>
#include <queue>
#include <algorithm>
#include <functional>

using namespace std;
#define M 100005
struct A
{
int lt, rt;
long long sum;
}tree[M * 5];
int len;
void maketree(int = 1, int = len, int = 1);
void insert(int , int , int = 1);
long long query(int, int, int = 1);
void add(int, int, long long, int = 1);
void swap(int &, int &);
void print();
int main()
{
int qs, t;
// memset(tree, 0, sizeof tree);
scanf("%d %d", &len, &qs);
maketree();
//print();
for (int i = 1; i <= len; ++ i)
{
scanf("%d", &t);
insert(t, i);
}
//print();
char str[2];
int a, b;
long long c;
for (int i = 0; i < qs; ++ i)
{
scanf("%s", str);
if (str[0] == 'Q')
{
scanf("%d%d", &a, &b);
if (a > b) swap(a, b);
printf("%lld\n", query(a, b));
}
else
{
scanf("%d%d%lld", &a, &b, &c);
if (a > b) swap(a, b);
add(a, b, c);
//print();
}
}
//system("pause");
return 0;
}
// 调试用
void print()
{
printf("----打印开始----\n");
printf("下标\t左端点\t右端点\t和值\n");
for (int i = 0; i < 30; ++ i)
{
printf("%d\t%d\t%d\t%d\n", i, tree[i].lt, tree[i].rt, tree[i].sum);
}
printf("----打印结束----\n");
}
void maketree(int lt, int rt, int pos)
{
tree[pos].sum = 0;
tree[pos].lt = lt;
tree[pos].rt = rt;
if (lt == rt) return;
int mid = (lt + rt) / 2;
maketree(lt, mid, pos << 1);
maketree(mid + 1, rt, (pos << 1) + 1);
}
void insert(int value, int id, int pos)
{
tree[pos].sum += value;
if (tree[pos].lt == tree[pos].rt) return;
int mid = (tree[pos].lt + tree[pos].rt) / 2;
if (id <= mid)
insert(value, id, pos << 1);
else
insert(value, id, (pos << 1) + 1);
}
long long query(int lt, int rt, int pos)
{
if (lt == tree[pos].lt && rt == tree[pos].rt)
return tree[pos].sum;
int mid = (tree[pos].lt + tree[pos].rt) / 2;
if (rt <= mid)
return query(lt, rt, pos << 1);
else if (lt > mid)
return query(lt, rt, (pos << 1) + 1);
else
return query(lt, mid, pos << 1) + query(mid + 1, rt, (pos << 1) + 1);
}
void add(int lt, int rt, long long value, int pos)
{
tree[pos].sum += value * (rt - lt + 1);
if (tree[pos].lt == tree[pos].rt)
return;
int mid = (tree[pos].lt + tree[pos].rt) / 2;
if (rt <= mid)
add(lt, rt, value, pos << 1);
else if (lt > mid)
add(lt, rt, value, (pos << 1) + 1);
else
{
add(lt, mid, value, pos << 1);
add(mid + 1, rt, value, (pos << 1) + 1);
}
}
void swap(int & a, int & b)
{
int t = a;
a = b;
b = t;
}
...全文

相关推荐

pku2104.rar_线段树

PKU2104的源代码,高级数据结构线段树的应用之一:找数据。

weixin_42651887

PKU 图论 DP 解题报告

数据结构 01页- 07页 图论相关 08页- 31页 。。。

den_xiang

pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11

POJ1151 Atlantis的源代码,非常经典线段树应用的题目,求面积。

四散

ACM算法模板和pku代码

本科参加ACM竞赛的过程中积累下来的一部分算法模板,和自己在PKU上面做的一部分题目。 模板目录结构: 目录: 动态规划 O(n^2)的最长上升子序列 nlogn最长上升子序列 高精度 计算几何 Graham扫描法 两线段交点 凸多边形面积 半平面交 计算几何库 数据结构 闭散列法整数hash 开散列法整数hash 字符串hash 堆 二维树状数组 Trie树 二叉查找树 线段树 RMQ LCA+RMQ SB-Tree 数论 生成紧凑素数表 分解质因子 最大公约数 a^b mod n 扩张欧几里德算法 素数表质因子分解 Stirling公式 中国剩余定理 欧拉数(递推法) 欧拉数(公式法) 十进制转负进制 归并排序求逆序数 Pell方程 Catalan数,100以内 欧拉函数讲解 组合计数 组合数计算(double) 组合数计算(高精度) r-组合生成算法 r-排列生成算法 r-错位排列生成算法 图论 传递闭包 欧拉回路判定 有向图欧拉路径 二分图最大匹配 匈牙利算法 二分图最大匹配 HK算法 二分图最大权匹配 KM算法 割边 强连通分量 缩点 Kosaraju算法 最大团 最小树形图 无向图全局最小割 stoer-wagner O(n^3) 最短路径优先算法 SPFA 网络流 最大流:Ford&Fulkerson算法 最大流:Dinic算法 最大流:ek算法 最大流:dsp算法 最大流:hlpp算法 最小费用最大流:bellman_ford找增广路 最小费用最大流:ssp算法 字符串 KMP 通配符匹配 最小表示法 后缀数组 倍增算法 基于多串匹配的有限状态自动机 未分类 归并排序 星期几的计算 N皇后构造法 几个常用的位操作 最大最小定理总结 0/1分数规划总结 (by yxysdcl 2008/11/19) 代码目录结构: 目录: 动态规划 钉子和小球 Hash+dp分词(摩尔电码) 火柴棒等式 DAG图DP,老鼠打洞 最短子路径 最少回文数 矩阵链乘 树形DP 最少的石子填到根节点 树种删除最少的边使刚好剩下P个点 树的支配集 最优连通子集 带背包的树形DP 最小顶点覆盖,判唯一 用最少的点覆盖所有的边 DAG上的记忆化树形DP,博弈 有限状态自动机+树形DP 状态压缩DP 炮兵阵地 Help Bob,买匹萨 匹配数量 堆筛子 全排列式状态DP 计算几何 多边形地图染色 数据结构 Hash 枚举+hash,方程解数 点集对称中心 字符hash,统计出现最多的单词 类此The Happy worm 数据结构 树状数组 覆盖某区间数量统计 Cows Stars 两个树桩数组 二维树状数组 数据结构 双端队列 Sliding Window 数据结构 线段树 Cows 线段染色 排队问题 第K大的数 离散化+线段树 灯光投影 网络赛取连续子序列问题 线段树+树状数组+并查集,转化为排队问题 离散化 离散化矩形切割,矩形覆盖面积统计 覆盖矩形周长统计 离散化矩形切割 灯光投影 搜索 导弹 Bfs+hash状态的抽象,模关系 Bfs变形,钥匙与门 双向广搜 迭代加深 优先队列搜索,过最少的门救人,建图 A*搜索 图论 差分约束 Intervals bellman_ford Intervals SPFA 出纳员的雇佣 不等式组 图论 割边 图染色 拓扑 树 欧拉路径) 割点+统计删除后剩下多少连通图 删除一个点使得连通分量最多 图染色 拓扑排序全部序列 最大生成树 有向图欧拉路径 字典序最小的有向图欧拉路径 图论 匹配 完美匹配FBI Koning定理,泥地 二分图最大独立集 通讯站天线覆盖 二分图拆分后匹配 二分图某边唯一匹配 最小权匹配 海上矿工 floyd预处理 最大权匹配,需要非完全图转完全图 传递闭包+最小路径覆盖 可以重复经过点 图论 网络流 Adding-the-maximum-flow arc 增量网络流 区间枚举,猴子语言+网络流 最小费用最大流 最大流最小割定理 摧毁伞兵 最大流最小割定理 泥地 图论 最短路径 Dijkstra+heap 昂贵的聘礼 最短路变形 树中任意点对最短路和 Bellman_ford 货率 限制长度最短路,负环判连通,点权变边权,改变正负号 表达式求值 算法优先算法求表达式的值 词法分析与算法优先算法,集合运算:差集,并集,交集 矩阵乘法 线段覆盖数量 矩阵构造,nlogn矩阵乘法 2-SAT XOR

yxysdcl

pku 2761(求区间内第k小的数)

pku 2761(求区间内第k小的数) 我是用线段树去做的,好像也可用树状数组做的,稍微有一点注释在里面的^_^

fhyveus
评论 3
收藏 已收藏
分享
返回顶部
songzhipeng08
C++ 语言 65,214 成员 250,514 内容