給出乙個長度為n的整數序列a1,a2,...,an,進行m次操作,操作分為兩類。
操作1:給出l,r,v,將al,al+1,...,ar分別加上v;
操作2:給出l,r,詢問
第一行乙個整數n
接下來一行n個整數表示a1,a2,...,an
接下來一行乙個整數m
接下來m行,每行表示乙個操作,操作1表示為1 l r v,操作2表示為2 l r
保證1≤n,m,ai,v≤200000;1≤l≤r≤n,v是整數
對每個操作2,輸出一行,表示答案,四捨五入保留一位小數
保證答案的絕對值大於0.1,且答****值的小數點後第二位不是4或5
資料隨機生成(n,m人工指定,其餘整數在資料範圍內均勻選取),並去除不滿足條件的操作2
示例1
4
1 2 3 4
52 2 4
1 1 3 1
2 2 4
1 2 4 2
2 1 3
0.3
-1.4
-0.3
解題思路:這個題一看就是需要線段樹的維護,但是這個求sin有點難操作。我們可以把每乙個位置的數拆分成cos(a[i])+isin(a[i])
那麼當我們需要進行操作1的時候,我們只需要將那個數也拆成這樣進行乘法運算就行,然後我們最後查詢的時候我們只需要查區間的和的虛部就行。
ps: real() 這個是實根
#include#include#include#includeusing namespace std;
const int maxn=2e5+10;
#define mem(a,b) memset(a,b,sizeof(a))
typedef complexe;
int n,m,a[maxn];
e sum[maxn<<2],lz[maxn<<2];
void pushup(int k)
void pushdown(int k)
void build(int l,int r,int k)
int mid=(l+r)>>1;
build(l,mid,k<<1);build(mid+1,r,k<<1|1);
pushup(k);
}void cha(int l,int r,int ql,int qr,e x,int k)
int mid=(l+r)>>1;
pushdown(k);
if(qr<=mid) cha(l,mid,ql,qr,x,k<<1);
else if(ql>mid) cha(mid+1,r,ql,qr,x,k<<1|1);
else cha(l,mid,ql,mid,x,k<<1),cha(mid+1,r,mid+1,qr,x,k<<1|1);
pushup(k);
}double query(int l,int r,int ql,int qr,int k)
int mid=(l+r)>>1;
pushdown(k);
if(qr<=mid) return query(l,mid,ql,qr,k<<1);
else if(ql>mid) return query(mid+1,r,ql,qr,k<<1|1);
else return query(l,mid,ql,mid,k<<1)+query(mid+1,r,mid+1,qr,k<<1|1);
}int main()
else
} return 0;
}
Wannafly挑戰賽6 D 鎖
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 題目描述 106號房間共有n名居民,他們每人有乙個重要度。房間的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複...
Wannafly挑戰賽16 D 打怪(DP)
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 有a種 b種屬性,和c種怪物。對於第k種怪物,給出 i和屬性j的搭配在乙個單位時間內對其造成的傷害h k,i,j。已知一開始使用 i,需要時間x i,使用屬性i,需...
Wannafly挑戰賽20 D挑選隊友
d 挑選隊友 進入討論 77 304 通過輸入包括兩行 第一行包括三個數n,m,k,表示共有n位選手,m個群,需要有k名選手被選擇 第二行包括m個數,第i個數表示第i個群有si個選手 n 100000,m k n 輸出包括一行 第一行輸出方案數 由於輸出可能比較大,你只需要輸出在模998244353...