为什么如果注释掉 del 函数里的更改开头用的 else head=nxt[k] (代码第 29 行)也能 AC?
这样写只要数据中删去第一个数就会 WA,给一个 Hack:
输入
2
1 1
1
1
输出
2
以下 AC 代码输出
1 0
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=100002;
int lst[N];
int nxt[N];
int head=1;
void addl(int q,int k){
if(k==head) head=q;
int s=lst[k];
lst[q]=s;
nxt[q]=k;
nxt[s]=q;
lst[k]=q;
}
void addr(int q,int k){
int x=nxt[k];
lst[q]=k;
nxt[q]=x;
nxt[k]=q;
lst[x]=q;
}
void del(int k){
if(!nxt[k] && !lst[k]) return ;
if(lst[k]!=-1) nxt[lst[k]]=nxt[k];
//else head=nxt[k];//更改开头
if(nxt[k]!=-1) lst[nxt[k]]=lst[k];
nxt[k]=0;
lst[k]=0;
}
int main(){
int n;
cin>>n;
memset(lst,-1,sizeof(lst));
memset(nxt,-1,sizeof(nxt));
for(int i=2; i<=n; i++){
int k,p;
cin>>k>>p;
if(!p) addl(i,k);
else addr(i,k);
}
int m;
cin>>m;
while(m--){
cin>>n;
del(n);
}
for(int i=head; i!=-1; i=nxt[i]) cout<<i<<" ";
return 0;
}