Wannafly挑戰賽22 D 整數序列

2021-08-25 11:10:57 字數 1853 閱讀 5001

給出乙個長度為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...