這裡的突破口在於小於等於25且大於等於3的質數連乘在1e8左右,所以,我們可以在操作上,將其看作對1e8去求模,而不是對每個都進行預處理。
時間複雜度
#include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define inf 0x3f3f3f3f
#define big_inf 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define half (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define lson lsn, l, mid
#define rson rsn, mid+1, r
#define ql lson, ql, qr
#define qr rson, ql, qr
#define myself rt, l, r
#define mp(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxn = 2e5 + 7;
const ull mod[8] = ;
const ull mod = 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23;
inline int _id(ull mx)
int n, q;
ull a[maxn], tree[maxn << 2], sum[maxn << 2], del[maxn << 2];
bool lazy[maxn << 2] = ;
inline void pushup(int rt)
void buildtree(int rt, int l, int r)
int mid = half;
buildtree(lson); buildtree(rson);
pushup(rt);
}inline void pushdown(int rt, int l, int r)
}void update(int rt, int l, int r, int ql, int qr, ull val, ull d)
pushdown(myself);
int mid = half;
if(qr <= mid) update(ql, val, d);
else if(ql > mid) update(qr, val, d);
else
pushup(rt);
}ull query(int rt, int l, int r, int ql, int qr, int op)
int main()
else
}return 0;
}
區間變成等差數列(線段樹)
keven 特別喜歡線段樹,他給你乙個長度為 n的序列,對序列進行m次操作。操作有兩種 1lrk 表示將下標在 l,r 區間內的數字替換成 k,k 1,k r l 2lr 表示查詢區間 l,r 的區間和 第一行兩個整數 n m,表示序列的長度和操作次數 1 n,m 2e5 第二行 n個整數,表示序列...
線段樹專題 樹上等差數列
題目大意 思路 線段樹維護區間的a1和an,公差為1。poj3468 include define ll long long using namespace std define max node 400005 define max 100005 struct node node max node ...
求和問題(線段樹維護等差數列)
題目描述 你現在有乙個陣列 aa 我們定義如下的兩種操作 1.修改 形如 00 ll rr 效果為對所有 l i rl i r 執行 ai i l 1 ai i l 1 直觀地說就是al 1,al 1 2,al 2 3 ar r l 1al 1,al 1 2,al 2 3 ar r l 1 這個樣子...