該題應該有很多的解法,想過用二分查詢,但是排序操作的複雜度讓我們傷不起。這裡用splay來實現是很方便的。首先插入乙個點,即第乙個點,然後再依次用二叉排序樹方式插入當前點,再把該點旋轉到根部(這樣方便我們找前驅和後繼,否則需要中序遍歷整棵樹來確定),再在存在前驅和後繼的情況下尋找前驅和後繼。接下來就很好辦了。
**如下:
#include #include#include
#include
#define l(x) tree[x].ch[0]
#define r(x) tree[x].ch[1]
#define inf 0x3ffffff
#define maxn 33000
using
namespace
std;
intn, seq[maxn], que[maxn], front, rt;
struct
node
}tree[maxn];
void
init()
rt = que[++front];
tree[rt].new(seq[
1], 0);}
int insert(int &rt, int &num, int fa) //
引用僅僅為了速度考慮
if (num >tree[rt].v)
else
}void rotate(int x, intf)}
void splay(int x, int
obj)
else
if (x == l(y) && y ==l(z))
else
if (x == r(y) && y ==r(z))
else
if (x == r(y) && y ==l(z))
else
}if (obj == 0) }
int findpre(int rt, int
num)
else
}int findnext(int
rt)
else
}int
main()
init();
if (n >= 1
)
for (int i = 1; i <= n; ++i)
if(r(rt))
sum +=ans;
}printf(
"%d\n
", sum);
}return0;
}
tyvj1185營業額統計
描述 description 營業額統計 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會...
營業額統計
給出乙個 n 個數的數列,定義 f i min i ge j 求 sum f i 題目就要我們求在這個數之前並且和這個數的差最小的數,我們考慮這個數必定出現在當前 a i 的前驅或後繼中。所以我們可以用平衡樹維護這個數列,每次求一下前驅和後繼,注意這裡可以相等,再把原數插入進去即可。includeu...
營業額統計 Treap
tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的...