bzoj 4821 Sdoi2017 相關分析

2022-04-30 19:51:08 字數 2675 閱讀 7113

做法顯然 就是維護一顆線段樹

裡面裝4個東西 區間x的和 區間y的和 區間$x^2$的和 區間$xy$的和

然後裝4個標記 add操作對x的影響 add操作對y的影響 cover操作對x的影響 cover操作對y的影響

唯一要想一想的東西在於怎麼維護順序

我一開始的愚蠢做法是每個節點維護乙個nw nw=0表示當前節點上一次受到的操作是add nw=1表示....是cover

然後每次pushdown的時候 例如當前節點的nw是0 現在我們把它pushdown 我們看左兒子 如果他的nw是1 我們就得先pushdown它的左兒子 然後在更新左兒子的值 右兒子類似

如果當前節點的nw是1 也就是cover操作 就不需要管左兒子和右兒子的nw 因為全都被cover掉了

這樣複雜度是

事實上這樣寫很麻煩

我們不需要維護nw 因為cover操作的特殊性: cover之後就不用管之前幹了什麼

那麼對於乙個節點 如果tag1,tag2不為0 且tag3,tag4也不為0 那麼我們先做tag3,tag4也就是先cover

每次cover操作的時候我們把節點的tag1,tag2設為0,也就是之前的操作全不管

這樣複雜度少乙個log 而且好寫一些

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

5ll read()

8while(c>='

0' && c<='9')

9return x*f;10}

1112

struct

node

2021

void

pr()

24 } tr[400400

];25

26#define lc (i<<1)

27#define rc (i<<1|1)

28 ll x[100100],y[100100

];29

30 inline long

double calc_sum(int l,int

r)33 inline long

double calc_sqr(int

l)36 inline long

double calc_sqr(int l,int

r)39

40void update(int

i)46

47void build(int i,int l,int

r)54

int md=(l+r)>>1

;55 build(lc,l,md),build(rc,md+1

,r);

56update(i);57}

5859

void change(int i,long

double s,long

double

t)68

69void pushdown2(int

i)75

76void change(int i,long

double s,long

double

t)84

85void pushdown1(int

i)91

92void pushdown(int

i)96

if(tr[i].tag1!=0 || tr[i].tag2!=0)99

}100

101void change1(int i,int l,int r,int s,int

t)107

pushdown(i);

108change1(lc,l,r,s,t);

109change1(rc,l,r,s,t);

110update(i);

111}

112113

void change2(int i,int l,int r,int s,int

t)119

pushdown(i);

120change2(lc,l,r,s,t);

121change2(rc,l,r,s,t);

122update(i);

123}

124125 node query(int i,int l,int

r)136

137void ask(int l,int

r)146

147int

n,m;

148149

intmain()

163else

if(tp==2

)167

else

if(tp==3

)171

}172

return0;

173}

174175

/*176

3 5177

1 2 3

1781 2 3

1791 1 3

1802 2 3 -3 2

1811 1 2

1823 1 2 2 1

1831 1 3

184*/

view code

都得開long double

一開始只開了long long ** 調了半天

BZOJ 4821 Sdoi2017 相關分析

description frank對天文學非常感興趣,他經常用望遠鏡看星星,同時記錄下它們的資訊,比如亮度 顏色等等,進而估算出 星星的距離,半徑等等。frank不僅喜歡觀測,還喜歡分析觀測到的資料。他經常分析兩個引數之間 比如亮度和 半徑 是否存在某種關係。現在frank要分析引數x與y之間的關係...

BZOJ4821 SDOI2017 相關分析

bzoj luogu 你需要維護兩個陣列 資瓷一下三種操作。1 給出 l,r 設 overline x,overline y 分別表示區間 l,r 內 x i,y i 的平均數,求 frac r x i overline x y i overline y r x i overline x 2 2 給...

4821 Sdoi2017 相關分析

4821 sdoi2017 相關分析 time limit 10 sec memory limit 128 mb submit 191 solved 29 submit status discuss description frank對天文學非常感興趣,他經常用望遠鏡看星星,同時記錄下它們的資訊,比...