具有延迟传播时间限制问题的分段树
Segment Tree with lazy propagation Time limit problem
以下是http://www.spoj.pl/problems/LITE/使用具有延迟传播的分段树。我是一个刚开始分割树木的人,我不明白为什么我会得TLE。有人能看一下并帮我纠正错误吗?
#include <iostream>
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 100000
using namespace std;
int M[2*MAX+1];
int flag[2*MAX+1];
int count;
void refresh(int begin,int end,int n)
{
M[n] = end-begin+1 - M[n];
flag[n]=0;
flag[n*2] =!flag[n*2];
flag[n*2+1] =!flag[n*2+1];
}
void update(int begin,int end,int i,int j,int n=1)
{
if(flag[n])
{
refresh(begin,end,n);
}
if(begin>=i && end<=j)
{
if(!flag[n])
{
refresh(begin,end,n);
}
flag[n] = 0;
return;
}
else if(begin>=end)
{
return;
}
else
{
int mid = (begin+end)>>1;
if(i<=mid)
{
update(begin,mid,i,j,n*2);
}
if(j>mid)
{
update(mid+1,end,i,j,n*2+1);
}
if(flag[2*n])
{
refresh(begin,mid,2*n);
}
if(flag[2*n+1])
{
refresh(mid+1,end,2*n+1);
}
M[n] = M[n*2]+ M[n*2+1];
}
}
int query(int begin,int end,int i,int j,int n=1)
{
if(flag[n])
{
refresh(begin,end,n);
}
if(begin>=i && end<=j)
{
return M[n];
}
if(begin>=end)
{
return 0;
}
int mid = (begin+end)>>1;
int l=0,r=0;
if(i<=mid)
{
l = query(begin,mid,i,j,n*2);
}
if(j>mid)
{
r = query(mid+1,end,i,j,n*2+1);
}
if(flag[2*n])
{
refresh(begin,mid,2*n);
}
if(flag[2*n+1])
{
refresh(mid+1,end,2*n+1);
}
M[n] = M[n*2]+ M[n*2+1];
return l+r;
}
int main()
{
memset(M,0,sizeof M);
int n,m,a,b,c;
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
if(a==0)
{
update(1,n,b,c);
}
else
{
printf("%dn",query(1,n,b,c));
}
}
return 0;
}
M[node]^=1;
可能比M[node] = (M[node]==0)?1:0;
快,(begin+end)>>1
比(begin/end)/2
快,但与不太相关
LE:试试让递归函数内联是否会运行得更快。我认为它分解了几次递归,工作速度也快了一点。也许将参数作为引用发送会使它运行得更快,试试看。如果测试用例选择得当,你仍然不应该用这种技巧通过测试,但有时它会有所帮助。
相关文章:
- 动态类的分段错误(家庭作业问题)
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 退出分段错误 ¿如何解决此问题?
- 分段故障背包问题
- 运行我的代码时出现分段错误(核心转储)问题
- 关于 std::堆栈推送的分段错误的问题
- 我的 std::strcopy 实现有什么问题?(分段错误)
- 标准::p空气分段构造函数中的可变参数模板问题
- AIX:未知分段故障问题
- isdigit 的分段错误问题
- SSE _mm_store_ps分段故障问题
- R内部分段故障和链接问题
- 分段故障和指针问题
- 创建二进制搜索树时出现分段故障问题
- 递归呼叫分段故障问题
- 分段错误C++转换问题
- 喊蟒蛇分段错误我该如何解决这个问题
- 分段错误和吸气器问题
- Linux问题中的分段11
- 这个 c++ 代码在给出分段错误时有什么问题