題意 : 給你 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...