P6327 區間加區間sin和 線段樹

2021-10-07 04:19:19 字數 1315 閱讀 5052

這題挺簡單的  不過錯的很玄學

用公式 sin(a+x)=sina*cosx+sinx*cosa cos(a+x)=cosa*cosx-sina*sinx就行 維護sinx的和和cosx的和更新就行了  需要注意的是常數比較大  三角函式的值盡量只算一次 傳遞下去就行 然後玄學的地方是 我把lazy[x]+=val;放到cal函式裡面會wa  把它單獨拿出來寫就能過 不知道為什麼

#include#include#include#include#include#define ri register int

#define ls id<<1

#define rs ls|1

#define lson ls,l,mid

#define rson rs,mid+1,r

using namespace std;

const int n = 2e5+10;

typedef long long ll;

double sine[n<<2],cosi[n<<2];

int a[n];

ll lazy[n<<2];

inline int in()

inline void pushup(int id)

inline void cal(ri x,double sinv,double cosv)

inline void pushdown(ri id)

}void build(ri id,ri l,ri r)

int mid = l+r>>1;

build(lson);build(rson);

pushup(id);

}void update(ri id,ri l,ri r,ri l,ri r,ri val)

pushdown(id);

int mid = l+r>>1;

if(l<=mid) update(lson,l,r,val);

if(r>mid) update(rson,l,r,val);

pushup(id);

}double query(ri id,ri l,ri r,ri l,ri r)

int mid = l+r>>1;

double ret = 0;

pushdown(id);

if(l<=mid) ret+=query(lson,l,r);

if(r>mid) ret+=query(rson,l,r);

return ret;

}int main()else

} return 0;

}

2651 區間和的和

輸入乙個長度為n的陣列a包括 n 1 n 2 個區間。每個區間所有數的和,被稱為區間和,求所有 n 1 n 2 個區間和的和。由於數值較大,輸出mod 1e9 7的結果。例如 3個數1 2 3,共有6個子區間,包含的數字如下 這些區間求和為1 2 3 3 5 6,這6個數字再求和為20.求出每個位置...

洛谷 P1712 區間

在數軸上有 n個閉區間 l1,r1 l2,r2 ln,rn 現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x,使得對於每乙個被選中的區間 li,ri 都有 li x ri。對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。...

327 區間和的個數

今天的題目還是看了一陣子 我是鏈結 意思是任意子區間內所有元素的和要在lower和upper之間,可以取等 所以題目中 0,0 2,2 都指向各自位置的元素,0,2 就是從第0個元素 一直加到 第2 個元素 等於 2 所以這就是為什麼輸出是3.class solution sum nums i fo...