Codeforces 444C 線段樹 懶惰標記

2022-05-22 15:09:08 字數 1301 閱讀 9759

前天晚上的cf比賽div2的e題,很明顯乙個線段樹,當時還在猶豫複雜度的問題,因為他是區間修改和區間查詢,肯定是要用到懶惰標記。

然後昨天真的是給這道題跪了,寫了好久好久,。。。我本來是寫了個add標記作為累加用,因為這個題目很明顯是累加型的懶惰標記,但是後來不知道腦子怎麼想的,又把add標記給刪了,認為只要用乙個set標記標註此時該樹是否是連續相同的,如果是,則值就存在setv【rt】中,然後就開始了漫長的wa的過程,很明顯,我這樣是採用了覆蓋性的懶惰標記,每次我pushdonw下去 還要先pushdonw下一層的,。。。如果真這麼寫 絕壁tl,不這麼寫 肯定wa,。。明顯乙個累加型的懶惰標記,硬是給我寫跪了,其實我後來意識到了要用累加型的,可是就是想沿著這個思路 改好。。最後躺在床上一想,真的只能用累加型的懶惰標記

發現線段樹的懶惰標記這一塊真的還不熟練,各種容易出錯。。。趕緊練

#include #include 

#include

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

#define ll __int64

using

namespace

std;

const

int n=100000+20

;ll d[n

<<2],cur[n<<2],flag[n<<2],add[n<<2

];int

n,m;

ll abs(ll x)

void build(int rt,int l,int

r)

int mid=(l+r)>>1

; build(lson);

build(rson);

}void up(int rt,int l,int

r)

else

}void pushdown(int rt,int l,int

r)

if (flag[rt]>0)}

void fix(int l,int r,ll v,int rt,int l,int

r) }

pushdown(rt,l,r);

if (l<=mid) fix(l,r,v,lson);

if (r>mid) fix(l,r,v,rson);

up(rt,l,r);

}ll query(

int l,int r,int rt,int l,int

r)int

main()

else}}

return0;

}

codeforces 463C(對角線技巧)

題意 選取兩個點,分別得到兩個點對應的對角線上的值,要求兩個點走的對角線不能相交,然後求兩個點的對角線的值最大。思路 對於乙個n n,求乙個點的左對角線和右對角線的技巧為 對於a i j 這個點對應的左對角線上的橫座標 縱座標都等於i j,右對角線 的i j n 都相等。例如4 4 的 i j 為左...

Codeforces 587C 樹上倍增

題意 求樹上兩點路徑中的前 a 10 小的點權值。思路 類似lca倍增演算法來儲存 i 2 j 路上的 前 10 小個 的點權值。然後要寫乙個權值合併 具體求 u v 的話,就是先分別計算 和 減1是lca會重疊 然後再合併,輸出答案。include include include include ...

Codeforces 976C 題解報告

對資料進行排序 1 按左邊的數從小到大排 2 若左邊的數相等,則按右邊的數從大到小排。排序之後,若乙個數的右邊的數小於等於上乙個數的右邊的數,則這兩個數必然符合題意。比如2 13 2 12 1 11排序之後,變為 1 11 2 13 2 12因為12 13,則有 2,12 被包含在它的上乙個數 2,...