线段树的TLE代码(pku 3468)

songzhipeng08 2010-08-25 12:03:43
试题链接:
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;
}
...全文
53 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDMAdmimistrator 2010-08-25
  • 打赏
  • 举报
回复
楼主你题目都没理解透....
CSDMAdmimistrator 2010-08-25
  • 打赏
  • 举报
回复
题目很简单你搞那么复杂干嘛?
qq120848369 2010-08-25
  • 打赏
  • 举报
回复
转到算法区。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧