題目描述
小\(c\)最近在學習線性函式,線性函式可以表示為:\(f(x) = kx + b\)。
現在小\(c\)面前有\(n\)個線性函式 \(f_i(x)=k_ix+b_i\),他對這\(n\)個線性函式執行\(m\)次操作。
每次可以:
1.\(m \ i \ k \ b\) 代表把第\(i\)個線性函式改為:\(f_i(x)=kx+b\)。
2.\(q \ l \ r \ x\) 返回\(f_r(f_(...f_l(x))) \mod 10^9+7\)。
用線段樹維護每一段區間的\(k\)和\(b\)的值,區間合併時,假設左區間是\(k_1\)和\(b_1\),右區間是\(k_2\)和\(b_2\),那麼合併後就是\(k_2(k_1x+b_1)+b_2\),即\(k_1k_2\)和\(k_2b_1+b_2\)。
依次維護修改即可,詳見**。
#include #include #define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int n = 5e5 + 5;
int n, m;
ll k[n << 2], b[n << 2];
struct node l, r, em;
char s[5];
inline int read()
while(ch >= '0' && ch <= '9')
return x * f;
}void update(int k)
void build(int k, int l, int r)
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
update(k);
}void change(int k, int l, int r, int x, int kk, int bb)
node query(int k, int l, int r, int x, int y)
; int mid = (l + r) >> 1; ll lk = -1, lb = -1, rk = -1, rb = -1;
if(x <= mid)
if(y > mid)
if(lk == -1 && lb == -1) return node;
else if(rk == -1 && rb == -1) return node;
else return node;
}int main()
else
}return 0;
}
BZOJ 4499 線性函式
time limit 20 sec memory limit 256 mb submit 177 solved 127 submit status discuss 小c最近在學習線性函式,線性函式可以表示為 f x kx b。現在小c面前有n個線性函式fi x kix bi 他對這n個線性函式執行m...
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...
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 ...