資料結構 解題報告

2022-04-29 21:09:07 字數 1470 閱讀 8714

給乙個長為\(n\)的\(a\),定義\(n\times n\)的\(b_=\sum\limits_^ra_i\),兩個操作,修改\(a_p\)為\(x\),詢問\(b_\)的歷史最小值。

我居然把d1t1鴿到d4晚上...

歷史最值+kd-tree

先離線的把點放到kd-tree中(要離散化)

然後就是矩形加和單點查詢,打一下歷史最值的標記就好了

我主要還是熟悉一下kd-tree,第三次打這玩意兒

注意kd-tree查詢點應該怎麼寫

code:

#include #include #include #include #define ll long long

const int n=1e5+5;

using std::min;

using std::max;

template void read(t &x)

int ch[n][2],l[n][2],r[n][2],pos[n][2],num[n],tot,root;

ll mi[n],dat[n],tag[n],histag[n],f[n];

#define ls ch[now][0]

#define rs ch[now][1]

void updata(int now)

if(rs) }

void pushdown(int now)

if(rs)

tag[now]=histag[now]=0; }}

int nk;

bool cmp(int a,int b)

int mid=l+r>>1;nk=k;

std::nth_element(num+l,num+mid,num+r+1,cmp);

now=num[mid];

build(ls,l,mid-1,k^1),build(rs,mid+1,r,k^1);

updata(now);

}bool ckm(int a,int b,int c,int d)

bool ck(int a,int b,int c,int d)

void modi(int now,int a,int b,int c,int d,int delta)

pushdown(now);

if(a<=pos[now][0]&&pos[now][0]<=c&&b<=pos[now][1]&&pos[now][1]<=d)

modi(ls,a,b,c,d,delta),modi(rs,a,b,c,d,delta);

}ll query(int now,int a,int b,int k)

{ if(pos[now][0]==a&&pos[now][1]==b) return mi[now];

pushdown(now);

int mid=pos[now][k];

if(k)

{if(b2019.3.24

CODEVS 資料結構系列 解題報告

用這兩道題學了下splay,也加深了對其的理解。平衡樹的標記與線段樹的標記不同,在平衡樹中,所有被訪問的節點一定不能有標記 否則將其splay後就找不到其原先的左右子樹了。資料結構1 include include include includeusing namespace std include...

資料結構專題 解題報告 J

原題洛谷p1484種樹,又撿到一題做過的,lucky。所謂用堆來解決問題,從來就是乙個詞,貪心,堆的使用是否成功取決於你貪心的策略,而貪心一般來說處理起全域性最優是有難度的,本題引入了乙個小有名氣的高階貪心策略,反悔貪心。通過讀題,我們發現貪心有乙個尷尬之處在於,你如果選擇了此刻的最大值i,那麼在選...

資料結構專題 解題報告 N

很板的題,我建了三棵樹,分別維護區間和最大值最小值,當然更簡潔的寫法是結構體一次掛三個屬性。不過也沒差其實。要注意的是,查詢時初始化最小值最大值要用llinf,之前定義的inf是不夠的,詳見我的巨集定義。話說這兩個還是之前偷看zh的cf上的 學來的 斜眼笑 include define maxn 1...