題解:
一道不錯的模板題
對於第乙個詢問,只需維護乙個支援刪除的堆
方法1.再維護乙個堆,將刪除的數加入這個堆,每次取元素時判斷一下是否和另乙個堆相等
方法2.利用左偏樹可以刪除任意節點(太久不寫都忘了)
當然也可以維護一顆平衡樹
對於第二個詢問,只需弄一顆平衡樹求它的前驅後繼就可以了
**:
#include usingnamespace
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的整數序列,並且有以下三種操作 ...