bzoj4499 線性函式

2022-07-19 03:30:09 字數 1365 閱讀 2469

題目描述

小\(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 ...