懒惰传播-可怕的spoj
Lazy Propagation - HORRIBLE spoj
我正在尝试从spoj解决可怕的问题,这里是链接:http://www.spoj.com/problems/HORRIBLE/我正试图用段树教自己懒惰传播。以下是我写的代码,我已经尽量使它简洁明了,如果有不清楚的地方请告诉我。
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll tree[500010];
ll lazy[500010]={};
void buildST(ll A[], ll STidx, ll l, ll r)
{
if(l==r)
{
tree[STidx]=A[l];
return;
}
ll left=2*STidx, right=left+1, mid=(l+r)/2;
buildST(A, left, l, mid);
buildST(A, right, mid+1, r);
tree[STidx]=tree[left]+tree[right];
}
void update(ll STidx, ll i, ll j, ll l, ll r, ll val)
{
//printf("%lld %lld %lld %lld %lldn", STidx, i, j, l, r);
if(lazy[STidx]!=0)
{
tree[STidx]+=(l-r+1)*lazy[STidx];
if(l!=r)
{
lazy[2*STidx]+=lazy[STidx];
lazy[2*STidx+1]+=lazy[STidx];
}
lazy[STidx]=0;
}
//printf("1n");
if(l>r || l>j || r<i)
return;
//printf("1n");
if(l>=i && r<=j)
{
//printf("%lldn", STidx);
tree[STidx]+=(r-l+1)*val;
if(l!=r)
{
lazy[2*STidx]+=val;
lazy[2*STidx+1]+=val;
}
return;
}
ll mid=(l+r)/2;
update(2*STidx, i, j, l, mid, val);
update(2*STidx+1, i, j, mid+1, r, val);
tree[STidx]=tree[2*STidx]+tree[2*STidx+1];
}
ll query(ll STidx, ll i, ll j, ll l, ll r)
{
if(lazy[STidx]!=0)
{
tree[STidx]+=lazy[STidx]*(r-l+1);
if(l!=r)
{
lazy[2*STidx]+=lazy[STidx];
lazy[2*STidx+1]+=lazy[STidx];
}
lazy[STidx]=0;
}
if(l>r || l>j || r<i)
return 0;
if(l>=i && r<=j)
return tree[STidx];
ll mid=(l+r)/2;
ll q1=query(2*STidx, i, j, l, mid);
ll q2=query(2*STidx+1, i, j, mid+1, r);
return q1+q2;
}
ll A[100010];
int main()
{
ll T, N, C, type, p, q, v, i;
scanf("%lld", &T);
while(T--)
{
scanf(" %lld %lld", &N, &C);
for(i=0; i<N; ++i)
A[i]=0;
for(i=0; i<4*N; ++i)
lazy[i]=0;
buildST(A, 1, 0, N-1);
while(C--)
{
scanf(" %lld", &type);
if(type==0)
{
scanf(" %lld %lld %lld", &p, &q, &v);
update(1, p-1, q-1, 0, N-1, v);
//for(i=1; i<=15; ++i)
// printf("%lld ", tree[i]);
//printf("n");
}
if(type==1)
{
scanf(" %lld %lld", &p, &q);
printf("%lldn", query(1, p-1, q-1, 0, N-1));
}
}
}
return 0;
}
提供的样例测试用例给出了我的代码的正确答案,但当提交时,我得到了错误的答案消息。我已经检查了我的代码很多次,但我还是找不到错误。
任何帮助都是感激的。谢谢!
我可以看到的一个错误是在更新函数
中的树(STidx) + =(唐森+ 1)*懒(STidx); 它应该是树(STidx) + = (rl + 1) *懒(STidx);
相关文章:
- cmake 使用 find_package 传播依赖项
- SPOJ 上的主生成器 PRIME1
- 组合"%"和可选后缀时,自动属性传播有时不起作用
- 跨目标传播库依赖项
- SPOJ中的运行时错误
- 张量流 c++ API 是否支持反向传播的自动微分?
- 代码在代码块上运行良好,但在 SPOJ 上无法运行
- 升级到G++4.8-exception_ptr.h不支持异常传播
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 为什么需要 FPU 重置以防止 NaN 结果传播到下一个计算结果?
- 为什么'std::p mr::p olymorphic_allocator'不会在容器移动时传播?
- 如何传播 NodeJS 包装C++代码的函数故障?
- 从升压::p罗塞斯到升压::子级的信号传播
- 模拟一个函数,该函数像操作员=和破坏者一样传播到每个字段
- 对于 spoj 的问题 TRT(对待奶牛)的 dp 的最佳方法是什么?
- 当我的代码工作正常时,为什么在SPOJ中遇到运行时(Sigabrt)错误
- TLE试图使用Dinic算法在SPOJ上求解Fastflow
- 如何传播未定义数量的模板参数
- 使用 std::future::unwrap 进行异常传播
- 懒惰传播-可怕的spoj