您的位置:首页 > 其它

bzoj 3506 && bzoj 1552 splay

2016-12-30 08:49 155 查看
查最小值,删除,翻转。。。

显然splay啊。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200005
#define inf 0x3f3f3f3f
using namespace std;
int n;
int ch
[2], fa
;
int a
;
int mn
,zhi
,size
;
void push_up(int x)
{
size[x] = size[ch[x][0]] + size[ch[x][1]] + 1;
mn[x] = min(zhi[x], min(mn[ch[x][0]], mn[ch[x][1]])); return;
}
int rev
;
void push_down(int x)
{
if (rev[x])
{
rev[x] ^= 1; rev[ch[x][1]] ^= 1; rev[ch[x][0]] ^= 1;
swap(ch[x][0], ch[x][1]);
}
return;
}
void rotate(int p)
{
int q = fa[p], y = fa[q], x = (ch[q][1] == p);
ch[q][x] = ch[p][x ^ 1]; fa[ch[q][x]] = q;
ch[p][x ^ 1] = q; fa[q] = p;
fa[p] = y;
if (y)
{
if (ch[y][1] == q)ch[y][1] = p;
else ch[y][0] = p;
}
push_up(q); return;
}
int root;
void splay(int x,int yy)
{
for (int y; y = fa[x]; rotate(x))
{
if (y == yy)break;
if (fa[y] != yy)
{
if ((ch[fa[y]][0] == y) ^ (ch[y][0] == x))rotate(x);
else rotate(y);
}
}
push_up(x);
if (!yy)root = x;
}
int cnt;
int find(int k, int x)
{
push_down(k);
if (mn[ch[k][0]] == x)
{
return find(ch[k][0], x);
}
if (zhi[k] == x)return size[ch[k][0]] + 1;
return find(ch[k][1], x) + size[ch[k][0]] + 1;
}
int fd(int k, int x)
{
push_down(k);
if (size[ch[k][0]] + 1 == x)return k;
if (size[ch[k][0]] + 1 >= x)return fd(ch[k][0],x);
return fd(ch[k][1], x - size[ch[k][0]] - 1);
}
struct node
{
int yuan,z;
friend bool operator < (node aa,node bb)
{
if(aa.z!=bb.z)return aa.z<bb.z;
return aa.yuan<bb.yuan;
}
}s
;
int yin
;
int main()
{
scanf("%d", &n); mn[0] = inf;
for (int i = 1; i <= n; i++)
{
s[i].yuan=i;scanf("%d",&s[i].z);
}
sort(s+1,s+n+1);
for(int i=1;i<=n;i++)
{
a[s[i].yuan]=i;
}
root = 1; a[n + 1] = inf;
ch[1][1] = 2; zhi[1] = a[1]; size[1] = n + 1;
for (int i = 2; i <= n + 1; i++)
{
size[i] = n - i + 2;
zhi[i] = a[i]; fa[i] = i - 1; ch[i - 1][1] = i;
}
for (int i = n + 1; i >= 1; i--)push_up(i);
splay(n, 0);
for (int i = 1; i <= n; i++)
{
int y = find(root, mn[root]);
if(i!=n)printf("%d ",y+(i-1));
else printf("%d",y+(i-1));
int t = fd(root, y+1);
splay(t, 0);
rev[ch[t][0]] ^= 1;
t = fd(root, 2);
splay(t, 0);
ch[t][0] = 0;
push_up(t);
}
puts("");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: