題目鏈結:
題目大意:單點更新。維護序列乘法。mod 1000000007。
解題思路:
1000000007*1000000007~10^18<9*10^18(int64)
所以單步模p乘法可以直接計算。
(a*b)%p=[(a%p)*(b%p)]%p,pushup維護即可。
query的rson的時候,要先判下lson是否存在,不存在ret=query(rson),否則ret=(query(lson)*query(rson))%p
#include "iostream
"#include
"string
"#include
"vector
"#include
"cstring
"#include
"fstream
"#include
"cstdio
"using
namespace
std;
#define m 100005
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define ll long long
#define mod 1000000007ll ans[m
<<2
];void pushup(int
root)
void build(int l,int r,int
root)
int mid=(l+r)>>1
; build(lson);
build(rson);
pushup(root);
}void update(int p,int value,int l,int r,int
root)
int mid=(l+r)>>1
;
if(p<=mid) update(p,value,lson);
else
update(p,value,rson);
pushup(root);
}ll query(
int l,int r,int l,int r,int
root)
else ret=rr;
}return
ret;
}int
main()
if(cmd==0
) }}
return0;
}
線段樹高階 區間取模
題目要求的操作 1 區間求和 2 區間取模 3 單點修改 這道題目不要用到 lazy陣列,因為條件是單點修改,直接修改的葉子節點,其次區間取模操作直接可以暴力。a mod b分為兩種情況 1 a b 2 a b 對於第一種情況 我們不用操作,對自己大的數取模就是自己。第二種情況 取模操作後a的值至少...
hdu 預處理 線段樹)
給n個數,m個詢問,問任意區間內與其它數互質的數有多少個 比如3個數1 2 4,詢問 1,3 那麼答案是1 千萬要記住,這樣的題目,如果你不轉變下,使勁往線段樹想 雖然轉變之後,也說要用到線段樹,但是維護的東西不同了 那麼會發現這樣的題目,區間與區間之間是無法傳遞資訊的,區間與區間是無法傳遞資訊的,...
初步線段樹 hdu1166
include include includeusing namespace std define max 50000 struct node node maintree 4 max void settree int n,int l,int r int main printf case d n tt...