BJOI2018 鏈上二次求和

2022-07-13 12:45:10 字數 1988 閱讀 5673

「bjoi2018」鏈上二次求和

我說今天上午寫部落格吧。怕自己寫一上午,就決定先寫道題。

然後我就調了一上午線段樹。

花了2h找到lazy標記沒有清空。我tm清空了有沒有標記沒清空標記本身。

又花25min找到某個乘法爆int了。int真的淡疼,要不是longlong自帶巨無霸常數,這輩子都不想用int。

乙個上午就沒有了。

1

//achen

2 #include3

#define for(i,a,b) for(int i=(a);i<=(b);i++)

4#define rep(i,a,b) for(int i=(a);i>=(b);i--)

5#define formylove return 0

6const

int n=200007,p=1e9+7,inv2=5e8+4

;7 typedef long

long

ll;8 typedef double

db;9

using

namespace

std;

10int

n,m,a[n],sum[n];

1112 templatevoid read(t &x)

1819

int mo(int x)

2021

int sg[n<<2],si0[n<<2],si1[n<<2],si2[n<<2

];22

bool tg[n<<2

];23

struct

tag lz[n<<2

],pls;

26 tag operator +(const tag&a,const tag&b) ; }

2728

#define lc (x<<1)

29#define rc ((x<<1)|1)

30#define mid ((l+r)>>1)

31void addtag(int

x,tag y)

3738

void down(int

x) ;/////////43}

4445

void build(int x,int l,int

r) 50 build(lc,l,mid); build(rc,mid+1

,r);

51 sg[x]=mo(sg[lc]+sg[rc]);

52 si0[x]=mo(si0[lc]+si0[rc]);

53 si1[x]=mo(si1[lc]+si1[rc]);

54 si2[x]=mo(si2[lc]+si2[rc]);55}

5657

void upd(int x,int l,int r,int ql,int

qr)

59down(x);

60if(ql<=mid) upd(lc,l,mid,ql,qr);

61if(qr>mid) upd(rc,mid+1

,r,ql,qr);

62 sg[x]=mo(sg[lc]+sg[rc]);63}

6465

int qry(int x,int l,int r,int ql,int

qr)

7374

intmain()

79 for(i,1,n) sum[i]=mo(sum[i-1]+sum[i]);

80 build(1,1

,n);

81 for(i,1

,m) ; upd(1,1

,n,l,r);

88if(r

90 upd(1,1,n,r+1

,n); 91}

92}93else

if(o==2

) 97}98

formylove;

99 }

view code

BJOI2018鏈上二次求和 線段樹

l,r 的限制可以拆成 1,l 1 1,r 然後考慮推式子。設s is i si 為a ia i ai 的字首和。a ns i 1x j ins j sj i sum sum s s ans i 1x j i n sj sj i 設t it i ti 為s is i si 的字首和。a ns i 1...

BJOI2018 求和 倍增LCA

master 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的 k 次方和,而且每次的 k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了 pupil 但 pupil 並不會這麼複雜的操作,你能幫他解決嗎?輸入格式 第一行...

鏈上二次求和

link 正在肝的一道黑題 首先處理那個奇怪的詢問操作。我們可以對於那個奇怪的東西進行暴力推式 ans l,r sum limits r sum limits sum limits 用字首和搞一下就是 sum limits r sum limits sum 分離一下 sum limits r m s...