HDU 4893 2014多校三 線段樹

2022-05-22 14:57:11 字數 2220 閱讀 9129

給定乙個初始都為0的序列,有三種操作,前兩種比較正常,乙個是對某個位置的數add k,另乙個是query區間和。然後比較麻煩的是第三個操作,把某個區間裡面的每個值改成離它最近的fibonacci數,如果存在左右兩個離它近的,優先取左邊數值小的

一看到前兩個操作馬上就想上手敲樹狀陣列,後來看到第三個就有點傻眼了,思維當時一直停留在怎麼快速改值。。但忽略了題目本身要求什麼,只有操作2才是輸出,也就是只要求區間和值而且,其他兩個都是操作而已,在聰哥的提醒下,知道對線段樹開兩個值記錄+乙個懶惰標記,乙個值d記錄正常的區間和值,另乙個sf記錄當前的fibanacci數值和

懶惰標記記錄當前區間是否被3操作過,若被標記了,下次query就是返回sf,否則返回d。

不過一開始思路還是有點不清晰,還wa了幾發。明顯按上面的轉化就是乙個普通的單點更新+懶惰標記+區間查詢的線段樹了嘛

主要錯在pushdown函式和3操作處理上。沒分清模組

首先3操作命名為fix,fix找到對應的區間後,就進行懶惰標記,順便把當前區間d改為sf值,然後向上傳遞。

add操作,首先,找到最後單點即進行更新操作,否則pushdown,把懶惰標記傳遞下去,在標記裡面也是要對d=sf操作的,最後向上傳遞結果

query就更明顯了,找區間return sf 或者 d,沒找到就先pushdown

一開始糊里糊塗,pushdown又沒push好,還沒修改當前的值

比賽的時候還是有點糊里糊塗,線段樹功底還不夠,還要繼續練

#include #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 = 100010

;ll f[

100];

ll d[n

<<2],flag[n<<2],sf[n<<2

];ll pref[n];

intn,q;

void

init()

}void build(int rt ,int l,int

r)

int mid=(l+r)>>1

; build(lson);

build(rson);

sf[rt]=sf[rt<<1]+sf[rt<<1|1];}

void change(int

rt)void up(int rt,int l,int

r)void pushdown(int rt,int l,int

r)void fix(int l,int r,int rt,int l,int

r)

int mid=(l+r)>>1

;

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

else

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

else

if (flag[rt<<1]==1 && flag[rt<<1|1]==1

) up(rt,l,r);

}void add(int loc,ll val,int rt,int l,int

r) }

return

; }

pushdown(rt,l,r);

int mid=(l+r)>>1

;

if (loc<=mid) add(loc,val,lson);

else

add(loc,val,rson);

up(rt,l,r);

}ll query(

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

r) pushdown(rt,l,r);

int mid=(l+r)>>1

;

if (r<=mid) return

query(l,r,lson);

else

if (l>mid) return

query(l,r,rson);

else

}int

main()

else

if (op==2

)

else}}

return0;

}

hdu多校第三場

題意是將給出的數相加計算出 其中p 的倍數的最大個數。由題意可得,在任意兩個數相加時,其模值必在0 p 1之間,將兩數相加的模值替換掉之前的兩個數字,得到長度減一的效果,用0和1 標記對應模值是否出現,從而代表被處理過的但還沒有達到 p 的倍數的值,直到某次得到的模值為 0 時,再清空之前的標記 代...

2015多校第三場hdu5326 work

題意 給m對朋友構成乙個樹,詢問子樹 包括孫輩 個數為k的有幾個 思路 賽中小夥伴有類似於並查集的方法構造樹,同時統計每個的子樹有幾個,ac的,賽後自己敲的時候用鄰接矩陣構造的鍊錶來寫,類似於二分匹配的時候用的鍊錶,同時用l陣列和r陣列記錄每個點以及這個點的子樹 小夥伴的並查集構造樹 include...

2016多校聯合第三場 HDU5760

給你個 n 然後 n個數,你要找到乙個最長的序列 s 輸出其長度,並且輸出不同的 s的個數。s 序列必須是回文的,並且中間最小,往兩邊依次增大,可以相等。s1 與s2 不同當且僅當長度不同或者存在某位s1 i s2 i 這個dp比較難。n範圍比較小,先把 a 陣列離散化。方便之後處理。再預處理兩個陣...