我已经给出了一个具有N元素且具有三种查询类型的数组
查询1:
为范围[L,R]中的所有元素添加值C,即A[i]+=c where L<=i<=R
查询2 为范围[L,R]中的所有元素分配值C,即A[i] =c where L<=i<=R
查询3 获取从L到R的所有元素的总和
我已经解决了使用具有延迟传播的分段树
我的方法:
维护Level [2] [n]数组Level[0][n] store the values to be incremented and Level[1][n] new value that we have to assign
这是我的更改功能:
public static void change(int curr , int x , int y , int a , int b, long c , long[] T , int add){
if(level[0][curr]!=-1 || level[1][curr]!=-1){
if(level[1][curr]!=-1) T[curr] = (((long)(y-x+1))*level[1][curr])%mod;
if(level[0][curr]!=-1)
T[curr]+= (((long)(y-x+1))*level[0][curr])%mod;
T[curr]%=mod;
if(x!=y){
if(level[0][curr]!=-1){
if(level[0][2*curr]==-1) level[0][2*curr]= level[0][curr];
else level[0][2*curr] += level[0][curr];
if(level[0][2*curr+1]==-1) level[0][2*curr+1]= level[0][curr];
else level[0][2*curr+1] += level[0][curr];
}
if(level[1][curr]!=-1){
level[1][2*curr]=level[1][curr];
level[1][2*curr+1]=level[1][curr];
}
level[0][2*curr]%=mod;
level[0][2*curr+1]%=mod;
}
level[0][curr]=level[1][curr]=-1;
}
if(x>y || y<a || x>b) return;
if(a<=x && b>=y){
if(add==1) T[curr]+= (((long)(y-x+1))*c)%mod;
else T[curr] = (((long)(y-x+1))*c)%mod;
T[curr]%=mod;
if(x!=y){
if(add==1)
{
if(level[0][2*curr]==-1) level[0][2*curr]= c;
else level[0][2*curr] +=c;
if(level[0][2*curr+1]==-1) level[0][2*curr+1]=c;
else level[0][2*curr+1] += c;
level[0][2*curr]%=mod;
level[0][2*curr+1]%=mod;
}else{
level[1][2*curr]=c;
level[1][2*curr+1]=c;
level[0][2*curr]=-1;
level[0][2*curr+1]=-1;
}
}
return;
}
change(2*curr, x, (x+y)/2, a, b, c, T, add);
change(2*curr+1, (x+y)/2+1, y, a, b, c, T, add);
T[curr] = T[2*curr]+T[2*curr+1];
T[curr]%=mod;
}
我没有得到正确的答案,也无法弄清楚我做错了哪里我尝试了多个测试数据并得到了正确的答案但是大数据集得到了错误答案
请帮助我我做错了Full Working Code
1 ≤ N ≤ 10^5
1 ≤ Q ≤ 10^5
1<=L<=R<=10^5
1<=Value<=10^9
Mod = 10^9+7