题面:https://ac.nowcoder.com/acm/contest/5157/C 【牛客挑战赛39、C、牛牛的等差数列 (线段树+细节处理)】
题解 线段树裸题
由于一个细节调了我50min
void insert(int i,int l,int r,LL f,LL d)
{
if(a[i].l>r||a[i].r
下传标记的时候分离了等差数列
却忘了在insert的时候分离等差数列
不注重细节!!惨痛教训!!!
其他问题
一开始写线段树的时候维护了24个标记,然后T了
后来想到一些数论的东西,发现只需要mod 3*5*7*11*13*17*19*23就可以了
query的时候再来mod一下
证明挺显然的
这本应该是一个线段树基础题的
代码:
#include
#include
#include
using namespace std;
inline int gi()
{
char c;
int num=0,flg=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flg=-1;
while(c>='0'&&c<='9'){num=num*10+c-48;
c=getchar();
}
return num*flg;
}
#define N 200005
#define LL long long
const int mod=111546435;
#define lc i<<1
#define rc i<<1|1
int val[N];
struct node{
int l,r;
LL x,f,d,len;
}a[N<<2];
inline void cal(int i,LL f,LL d)
{
(a[i].f+=f)%=mod;
(a[i].d+=d)%=mod;
a[i].x=(a[i].x+1ll*f*a[i].len+(1ll*(a[i].len)*(a[i].len-1)/2)%mod*d)%mod;
}
inline void pushdown(int i)
{
if(a[i].f&&a[i].l>1;
build(lc,l,mid);
build(rc,mid+1,r);
a[i].x=(a[lc].x+a[rc].x)%mod;
}
void insert(int i,int l,int r,LL f,LL d)
{
if(a[i].l>r||a[i].rr||a[i].r
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔