我这份代码TLE了6个测试点,但这份代码的时间复杂度应该是 O(Q) 的吧,因为每个数最多被删一次(就是代码中的 vis
数组最多标记一次),但不知为何TLE,向各位大佬求问。玄一关
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int pre[N], nxt[N], ord[N];
bool vis[N];
bool check(int a, int b) {
int c = a;
while (c != -1 && vis[c]) {
if (c == b) return 1;
c = nxt[c];
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
int Q;
cin>>Q;
memset(pre, -1, sizeof(pre));
memset(nxt, -1, sizeof(nxt));
vis[0] = 1;
//ord[0] = 0;
for (int i = 1; i <= Q; ++i) {
int t;
cin>>t;
if (t == 1) {
int x; cin>>x;
int nx = nxt[x];
nxt[x] = i, pre[i] = x, nxt[i] = nx;
if (nx != -1) pre[nx] = i;
vis[i] = 1;
//ord[i] = ord[x] + 1;
} else {
int x,y; cin>>x>>y;
int a = x, b = y;
if (!check(a,b)) swap(a, b);
long long sum = 0;
int c = nxt[a];
while (c != b && vis[c]) {
sum += c;
vis[c] = 0;
c = nxt[c];
}
nxt[a] = b, pre[b] = a;
cout<<sum<<endl;
}
}
return 0;
}