帶 sin, cos 的線段樹 牛客

2022-06-27 03:15:19 字數 1347 閱讀 4840

題意 : 給你 n 個數字,第一種操作是將乙個區間內每乙個數字加上同乙個數字,第二種操作是求乙個區間內每乙個數 sin 的累加和

思路分析 :對於每個區間維護一下 cos 和 sin 的值,當乙個區間要加上乙個數字時,此時再重新計算 sin的值時 , sin(a + x) = sin(a)*cos(x) + cos(a)*sin(x) ,乙個區間內的所有值都可以這樣計算,因此就會用到區間內的 sin 總和 以及 cos 的總和

這個題有個很坑的地方,就是大量的地方用到 sin 與 cos 函式,若輸入的是乙個整形數強制轉變為浮點數後再用 sin函式,cos函式則會超時,不強制轉換會快一半的時間!!!

**示例 :

#include using namespace std;

#define ll long long

const int maxn = 2e5+5;

#define lson k<<1

#define rson k<<1|1

int n, m;

struct node

t[maxn<<2];

void pushdown(int k)

int x;

void build(int l, int r, int k)

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

build(l, m, lson);

build(m+1, r, rson);

t[k].rs = t[lson].rs+t[rson].rs;

t[k].rc = t[lson].rc+t[rson].rc;

}void update(int l, int r, ll v, int k)

if (t[k].lazy) pushdown(k);

int m = (t[k].l+t[k].r) >> 1;

if (l <= m) update(l, r, v, lson);

if (r > m) update(l, r, v, rson);

t[k].rs = t[lson].rs+t[rson].rs;

t[k].rc = t[lson].rc+t[rson].rc;

}double sum;

void query(int l, int r, int k)

if (t[k].lazy) pushdown(k);

int m = (t[k].l + t[k].r) >> 1;

if (l <= m) query(l, r, lson);

if (r > m) query(l, r, rson);

}int main()

else

} return 0;

}

sequence 牛客 ( 線段樹)

題面 your are given two sequences a1 n,b1 n a b a1 n b1 n you need to answer max 1 l r n displaystyle max times sum b 1 l r nmax 1e 6 b i 1e 6 1e6 1 e6 ...

牛客網 剩下的樹 線段樹入門

mn o mn o mn 複雜度都可以過,可以見得資料之水當然這道題的資料量本身也是符合這個複雜度的,ps fill和memset別用得太多,有時候會被卡死 include include include include include include include include using n...

牛客網 sequence 線段樹 單調棧

官方題解 假設a中的元素互不相同,我們考慮a中的某個元素作為min的時刻。對於每個a i 我們找到左邊第乙個比它大的元素a l 右邊第乙個比它大的a r 那麼左端點在 l 1,i 右端點在 i,r 1 的區間min就為它。求l和r可以使用單調棧。考慮如何求某個a i 作為min的答案。如果a i 0...