給乙個長為\(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...