題目大意:
小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,...