取模取掛可真是令人質壁分離。。。。
兩兩乘積和可以直接用兩個區間的區間和相乘再加上兩個區間各自的乘積和得到,而相鄰乘積和直接兩段相加再加上左區間右端點與右區間左端點乘積就好了。
注意+mod%mod
#includeusing namespace std;
typedef long long ll;
const ll maxn=1e5+10;
const ll mod=1000000007;
ll n,q;
ll a[maxn];
struct tree
friend inline tree operator+(const tree &a,const tree &b)
ret.l=a.l,ret.r=a.r;
ret.ll=a.ll,ret.rr=b.rr;
ret.mul=((((a.summ*b.summ)%mod+a.mul)%mod+b.mul)%mod+mod)%mod;
ret.sum=(((a.sum+b.sum)%mod+a.rr*b.ll%mod)%mod+mod)%mod;
ret.summ=((a.summ+b.summ)%mod+mod)%mod;
return ret;
}}tr[maxn<<2],ans;
ll read()
#define lc (root<<1)
#define rc (root<<1|1)
void push_up(ll root)
void build(ll root,ll l,ll r)
ll mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
push_up(root);
}void update(ll root,ll l,ll r,ll x,ll key)
ll mid=(l+r)>>1;
if(x<=mid) update(lc,l,mid,x,key);
else update(rc,mid+1,r,x,key);
push_up(root);
}void query(ll root,ll l,ll r,ll l,ll r)
}int main()
}}
線段樹 維護序列
老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為 n 的數列,不妨設為 a1,a2,an。有如下三種操作形式 把數列中的一段數全部乘乙個值 把數列中的一段數全部加乙個值 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模 p 的值。輸入格式 第一行兩個整數 n 和 p ...
線段樹 I 維護序列
老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為 nn 的數列,不妨設為 a1,a2,ana1,a2,an。有如下三種操作形式 input 第一行兩個整數 nn 和 pp 第二行含有 nn 個非負整數,從左到右依次為 a1,a2,ana1,a2,an 第三行有乙個整數 mm,表示...
線段樹yy(線段樹維護括號序列 LCA)
沒有題目鏈結 一顆有 n 個節點的樹,q 組詢問,支援兩種操作 1.單點修改 2.路徑求和。1 n,q 1e5 題解 那麼可以建立一顆有根樹,每次更新時為兩個單點更新 加一次減一次 每次查詢時則是查詢 根的左括號到 x 點的左括號之和 根的左括號到 y 點的左括號之和 2 根的左括號到 x 與 y ...