#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
priority_queue<int, vector<int>, greater<int> >r;
priority_queue<int, vector<int>, less<int> >l;
int T, kase, n, L, t, cur, ans, num;
int main(int argc, char const *argv[])
{
scanf("%d", &T);
while (T--)
{
cur = ans = num = 0;
scanf("%d%d", &L, &n);
while (!r.empty()) r.pop();
while (!l.empty()) l.pop();
while (n--)
{
scanf("%d", &t);
if (t && num) num--;
else if (t && !(r.empty() && l.empty()))
{
int lpos = -INF, rpos = INF; num = 0;
if (!r.empty()) rpos = r.top();
if (!l.empty()) lpos = l.top();
bool lr;
if (l.empty()) lr = 1;
else if (r.empty()) lr = 0;
else if (cur - lpos > rpos - cur) lr = 1;
else if (cur - lpos < rpos - cur) lr = 0;
if (!lr)
{
if (l.empty()) while (1);
ans += cur - lpos;
cur = lpos; l.pop();
while (!l.empty() && (l.top() == cur))
num++, l.pop();
}
else
{
if (r.empty()) while (1);
ans += rpos - cur;
cur = rpos; r.pop();
while (!r.empty() && (r.top() == cur))
num++, r.pop();
}
}
else if (!t)
{
scanf("%d", &t);
if (t == cur) num++;
else if (t > cur) r.push(t);
else l.push(t);
}
}
printf("Case %d: %d\n", ++kase, ans);
}
return 0;
}
用两个优先队列维护信息,蛋糕大于他当前所在位置的,用从小到大的优先级;蛋糕小于等于他当前所在位置,用从大到小的优先级。两个队列取出的元素再进行比较