牛客挑战赛39、C、牛牛的等差数列 (线段树+细节处理)

题面: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





    推荐阅读