本文共 3465 字,大约阅读时间需要 11 分钟。
题意:有长为n的数列,初始化为全部为0,我们对它有三个操作:
#include#include #include #include using namespace std;const int MAXN = 100000+5;typedef long long ll;#define MOD 10007struct Node{ int l,r; ll sum,sum2,sum3; int add,mul;}tree[4*MAXN];void build(int node,int l,int r){ tree[node].l=l,tree[node].r=r; tree[node].add=0,tree[node].mul=1; if (l==r){ tree[node].sum=tree[node].sum2=tree[node].sum3=0; return; } build(node*2,l,(l+r)/2); build(node*2+1,(l+r)/2+1,r); tree[node].sum=(tree[node*2].sum+tree[node*2+1].sum)%MOD; tree[node].sum2=(tree[node*2].sum2+tree[node*2+1].sum2)%MOD; tree[node].sum3=(tree[node*2].sum3+tree[node*2+1].sum3)%MOD;}void PushDown(int node){ if (tree[node].add==0 && tree[node].mul==1) return; tree[node*2].sum3=(tree[node].mul*tree[node].mul%MOD*tree[node].mul%MOD*tree[node*2].sum3%MOD + 3*tree[node].mul*tree[node].mul%MOD*tree[node].add%MOD*tree[node*2].sum2%MOD + 3*tree[node].mul*tree[node].add%MOD*tree[node].add%MOD*tree[node*2].sum%MOD + (tree[node*2].r-tree[node*2].l+1)*tree[node].add%MOD*tree[node].add%MOD*tree[node].add%MOD)%MOD; tree[node*2].sum2=(tree[node*2].sum2*tree[node].mul%MOD*tree[node].mul%MOD + 2*tree[node].add*tree[node].mul%MOD*tree[node*2].sum%MOD + (tree[node*2].r-tree[node*2].l+1)*tree[node].add%MOD*tree[node].add%MOD)%MOD; tree[node*2].sum=(tree[node*2].sum*tree[node].mul + tree[node].add*(tree[node*2].r-tree[node*2].l+1)%MOD)%MOD; tree[node*2+1].sum3=(tree[node].mul*tree[node].mul%MOD*tree[node].mul*tree[node*2+1].sum3%MOD + 3*tree[node].mul*tree[node].mul%MOD*tree[node].add%MOD*tree[node*2+1].sum2%MOD + 3*tree[node].mul*tree[node].add%MOD*tree[node].add%MOD*tree[node*2+1].sum%MOD + (tree[node*2+1].r-tree[node*2+1].l+1)*tree[node].add%MOD*tree[node].add%MOD*tree[node].add%MOD)%MOD; tree[node*2+1].sum2=(tree[node*2+1].sum2*tree[node].mul%MOD*tree[node].mul%MOD + 2*tree[node].add*tree[node].mul%MOD*tree[node*2+1].sum%MOD + (tree[node*2+1].r-tree[node*2+1].l+1)*tree[node].add%MOD*tree[node].add%MOD)%MOD; tree[node*2+1].sum=(tree[node*2+1].sum*tree[node].mul%MOD + tree[node].add*(tree[node*2+1].r-tree[node*2+1].l+1)%MOD)%MOD; tree[node*2].mul=(tree[node*2].mul*tree[node].mul)%MOD; tree[node*2].add=(tree[node*2].add*tree[node].mul%MOD+tree[node].add)%MOD; tree[node*2+1].mul=(tree[node*2+1].mul*tree[node].mul)%MOD; tree[node*2+1].add=(tree[node*2+1].add*tree[node].mul%MOD+tree[node].add)%MOD; tree[node].add=0; tree[node].mul=1;}void Add(int node,int l,int r,int v){ if (tree[node].l>r || tree[node].r r || tree[node].r r || tree[node].r mid) return query(node*2+1,l,r,p); else return (query(node*2,l,mid,p)+query(node*2+1,mid+1,r,p))%MOD; /* if (tree[node].l>r || tree[node].r
转载地址:http://sbbqb.baihongyu.com/