BZOJ4499 線性函式 線段樹

2021-07-29 18:14:45 字數 1946 閱讀 2698

題目大意:

小c最近在學習線性函式,線性函式可以表示為:f(x) = kx + b。現在小c面前有n個線性函式fi(x)=kix+bi ,他對這n個線性函式執行m次操作,每次可以:

1.m i k b 代表把第i個線性函式改為:fi(x)=kx+b 。

2.q l r x 返回fr(fr-1(…fl(x))) mod 10^9+7 。

思路:

可以發現兩個線性函式f1

(x)=

k1x+

b1和f2(

x)=k

2x+b

2 ,求f1

(f2(

x)) 就等於(k

1k2)

x+(k

1b2+

b1) 。

也就是兩個線性函式套在一起還是乙個線性函式,而且這個東西滿足結合律,求f1

(f2(

f3(f

4(x)

))) 的時候可以先分別求f1

(f2(

x)) 和f3

(f4(

x)) ,然後套在一起就好了。

這樣可以直接上線段樹。

**:

#include 

using

namespace

std;

const

int maxn = 200010;

typedef

long

long ll;

const ll mod = 1000000007;

typedef pairpl;

inline

char get(void)

return *p1++;

}inline

void read(ll &x)

inline

void read(char &x)

inline

void write(ll x)

ll n, m, k[maxn], b[maxn];

pl t[maxn << 2];

inline pl pushup(pl l, pl r)

pl build(int o, int l, int r)

int mid = (l + r) >> 1;

return t[o] = pushup(build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r));

}inline

void modify(int o, int l, int r, int p, int k, int b)

int mid = (l + r) >> 1;

if (p <= mid) modify(o << 1, l, mid, p, k, b);

else modify(o << 1 | 1, mid + 1, r, p, k, b);

t[o] = pushup(t[o << 1], t[o << 1 | 1]);

}inline pl query(int o, int l, int r, int l, int r)

int mid = (l + r) >> 1;

pl lpl = make_pair(1, 0), rpl = make_pair(1, 0);

if (mid >= l) lpl = query(o << 1, l, mid, l, r);

if (mid < r) rpl = query(o << 1 | 1, mid + 1, r, l, r);

return pushup(lpl, rpl);

}inline ll calc(pl p, ll x)

int main(void) else

}return

0;}

完。

by g1n0st

bzoj 4499 線性函式 線段樹

題目鏈結 想說的話 沒什麼想說的 題解 我們都知道 f2 f1 x k2 k1 x b1 b2 k1 k2 x k2 b1 b1 然後用線段樹去維護連續的一段最終的f x 是什麼 查詢修改就都很簡單了.include define mod 1000000007 define maxn 200020 ...

bzoj4499 線性函式 線段樹

題目描述 小c最近在學習線性函式,線性函式可以表示為 f x kx b。現在小c面前有n個線性函式fi x kix bi 他對這n個線性函式執行m次操作,每次可以 1.m i k b 代表把第i個線性函式改為 fi x kx b 2.q l r x 返回fr fr 1 fl x mod 10 9 7...

bzoj4499 線性函式 線段樹 矩陣乘法

小c最近在學習線性函式,線性函式可以表示為 f x kx b。現在小c面前有n個線性函式fi x kix bi 他對這n個線性函式執行m次操作,每次可以 1.m i k b 代表把第i個線性函式改為 fi x kx b 2.q l r x 返回fr fr 1 fl x mod 10 9 7 1 n,...