感觉这里有问题,你这个c应该是要找到最左边的人吧,但是你while里的条件意思应该是说如果a[c].l==0,就代表他是最左边的那个人,可是在你的代码里没有把将左边没人的情况下,将他的l置为0或者右边没人的情况下把它的r置为0呀,所以这样找最左边的人的话逻辑应该是错的吧。(个人想法)
```c
int c;
for(int i=1;i<=n;i++)
{
if(b[i]==1)
{
c=i;
while(a[c].l!=0)
{
c=a[c].l;
}
break;
}
}
```
by sana_37 @ 2023-09-25 22:14:15
我和你的思路差不多的,AC了,你可以参考一下我的代码
```cpp
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<string.h>
#include<string>
int main(void)
{
int N;
cin >> N;//输入人数
//根据人数创建 left right IsOut 数组
int* left = (int*)malloc(sizeof(int) * (N + 1));
int* right = (int*)malloc(sizeof(int) * (N + 1));
bool* IsOut = (bool*)malloc(sizeof(bool) * (N + 1));
//初始化数组
//如果左没有人的话 其left 为-1;右边没有人的话1, 其 right 为-1
memset(left, -1, sizeof(int) * (N + 1));
memset(right, -1, sizeof(int) * (N + 1));
memset(IsOut, true, sizeof(bool) * (N + 1));//一开始都未去掉,设标志位为true
int index = 1;//这是记录左边第一个人的所对应的号码,一开始1号位于最左边 所以一开始index记录的是1
for (int i = 2; i <= N; i++)
{
int nums;//要被插入的号码
int flag;//标志左还是右 1为右 0为左
cin >> nums >> flag;
if (flag == 1)//右边
{
//1.当前标号的右边等于nums的右边
right[i] = right[nums];
//2.记得将nums的左边的右边变为当前标号
left[right[nums]]= i;
//3.再把nums的右边变为当前标号
right[nums] = i;
//4.最后把当前标号的left变为nums
left[i] = nums;
//右边插入完毕
}
else
{
//1.先把当前标号的左边变为nums的左边
left[i] = left[nums];
//2.再把nums左边的右边变为当前标号
right[left[nums]] = i;
//3.再把nums的左边变为当前标号
left[nums] = i;
//4.再把当前标号的右边变为nums
right[i] = nums;
//左边插入完毕
}
if (left[i] == -1)
{
index = i;//更新最左边的标号
}
}
int M;
cin >> M;//输入要去掉的人数
for (int i = 0; i < M; i++)
{
int number;
cin >> number;//输入号码
if (IsOut[number])//如果未被去掉过
{
IsOut[number] = false;//标记为去掉过
if (left[number] != -1)//如果number左边还有人
{
right[left[number]] = right[number];//就把它左边的右边变为它的右边
}
if (right[number] != -1)//如果number右边还有人
{
left[right[number]] = left[number];//就把它的右边的左边变为它的左边
if (left[right[number]] == -1)index = right[number];//更新最左边的号码
}
}
}
while (right[index] != -1)//循环,如果当前index的右边为-1,则说明他是最后一个人
{
cout << index << ' ';//输出当前的人
index = right[index];//把它的右边赋值给index,更新index
}
cout << index << ' ';//把最后一个人也输出
return 0;
}
```
by sana_37 @ 2023-09-25 22:15:34
```
#include<cstdio>
using namespace std;
int n,m;
struct node
{
int pre,nxt;
}a[100010];
void init()
{
for(int i=1;i<=n;i++)
a[i].pre=a[i].nxt=-1;
a[1].nxt=-1;
a[1].pre=0;
a[0].nxt=1;
}
void insert_left(int pos,int k)
{
a[a[pos].pre].nxt=k;
a[k].pre=a[pos].pre;
a[pos].pre=k;
a[k].nxt=pos;
}
void insert_right(int pos,int k)
{
a[a[pos].nxt].pre=k;
a[k].nxt=a[pos].nxt;
a[pos].nxt=k;
a[k].pre=pos;
}
void remove(int x)
{
if(a[x].pre==-1)
return;
a[a[x].pre].nxt=a[x].nxt;
a[a[x].nxt].pre=a[x].pre;
a[x].pre=-1;
a[x].nxt=-1;
}
void print()
{
int start=a[0].nxt;
while(1)
{
printf("%d ",start);
if(a[start].nxt==-1)
break;
start=a[start].nxt;
}
}
int main()
{
scanf("%d",&n);
init();
for(int i=2;i<=n;i++)
{
int k,p;
scanf("%d%d",&k,&p);
if(p==1)
insert_right(k,i);
else
insert_left(k,i);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
remove(x);
}
print();
return 0;
}
```
by Leo2525 @ 2023-09-27 21:58:56