ZJOI2007 報表統計

2022-05-31 07:54:12 字數 1559 閱讀 3468

題解:

一道不錯的模板題

對於第乙個詢問,只需維護乙個支援刪除的堆

方法1.再維護乙個堆,將刪除的數加入這個堆,每次取元素時判斷一下是否和另乙個堆相等

方法2.利用左偏樹可以刪除任意節點(太久不寫都忘了)

當然也可以維護一顆平衡樹

對於第二個詢問,只需弄一顆平衡樹求它的前驅後繼就可以了

**:

#include using

namespace

std;

#define inf 2000000000

const

int maxn=510000

;int ans,num,a[maxn*2],n,m,pre[maxn*2],root,v[maxn*2],dis[maxn*2

],left1[maxn*2],right1[maxn*2],fa[maxn*2],now,last[maxn*2

],root2,

fa1[maxn*2],leftson[maxn*2],rightson[maxn*2],count2[maxn*2],data[maxn*2

];char c[10

];int merge(int r1,int

r2)void delete1(int

x)

while

(q)

}void updata(int

x)void rotate(int x,inty)

else

fa[x]=fa[father];

if(fa[father])

fa[father]=x;

if (y==1) leftson[x]=father; else rightson[x]=father;

updata(father); updata(x);

}void splay(int x,int

goal)

else

else

} }

if (goal==0) root=x;

}void insert2(intx)

else

}data[++num]=x; fa[num]=y; count2[num]=1

;

if (x>data[y]) rightson[y]=num;

else leftson[y]=num;

splay(num,0);

}void getans(int

x) ans=min(ans,abs(maxn-x));

y=root;int minn=inf;

while

(y)

ans=min(ans,abs(minn-x));

}int

main()

pre[n]=a[n];

for (int i=1;i<=m;i++)

if (c[4]=='s'

)

if (c[4]=='g'

)

}}

ZJOI2007 報表統計

不想描述了,心累。兩個操作分別用splay和線段樹來維護 全域性的差值最小直接用splay在插入的時候維護前驅後繼即可 相鄰最小差值我們可以這樣搞 首先 用線段樹維護相鄰的最小值 可以注意到插入元素的操作,如果是在乙個元素之後反覆插入,這些元素之間更新出來的最小值是不會發生改變的。只有元素與元素之間...

ZJOI2007 報表統計

在原數列第 i 個後面新增乙個新元素 k 如果原數列的第 i 個元素已經新增了若干元素,則新增在這些元素的最後。查詢相鄰兩個元素的差值的絕對值的最小值。查詢所有元素中一對元素的差值的絕對值的最小值。第乙個操作很好維護,若要在第 i 個元素後面插值,那麼實際需要插入的位置是 i s i 1 其中 s ...

ZJOI 2007 報表統計(multiset)

題目鏈結 點我點我 題目描述 q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。經過仔細觀察,小q發現統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。在最開始的時候,有乙個長度為n的整數序列,並且有以下三種操作 ...