题解:AT_abc421_f [ABC421F] Erase between X and Y
xiaoyin2011 · · 题解
AT_abc421_f [ABC421F] 删除 X 到 Y 题解
题目链接
题目大意
有一个长度为
有
思路及实现
这道题看起来需要很多的序列查找元素值,所以卡住时间。
但是可以通过链表破局。针对操作一,只要找到元素
这里由于初始元素值为
由于最多插入
操作二如何在此基础上实现?如果找到了
考虑均摊,总共只会有
这种方法可行,但是还有最后一个问题。我们不知道
AC Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll Q, op, x, y;
ll nxt[500005];
int main()
{
scanf("%lld", &Q);
nxt[0] = -1;
for (int i = 1; i <= Q; i++)
{
scanf("%lld%lld", &op, &x);
if (op == 1)
{
nxt[i] = nxt[x];
nxt[x] = i;
}
else
{
scanf("%lld", &y);
ll cx = x, cy = y, sx = 0, sy = 0;
while (1)
{
if (nxt[cx] != -1)
{
cx = nxt[cx];
if (cx == y)
{
printf("%lld\n", sx);
nxt[x] = y;
break;
}
else
sx += cx;
}
if (nxt[cy] != -1)
{
cy = nxt[cy];
if (cy == x)
{
printf("%lld\n", sy);
nxt[y] = x;
break;
}
else
sy += cy;
}
}
}
}
return 0;
}