有一个问题(Hack)
  • 板块P1160 队列安排
  • 楼主Vct14
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/3 13:06
  • 上次更新2023/11/3 06:11:16
查看原帖
有一个问题(Hack)
677609
Vct14楼主2023/8/3 13:06

为什么如果注释掉 del 函数里的更改开头用的 else head=nxt[k] (代码第 2929 行)也能 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;
}

记录

2023/8/3 13:06
加载中...