2 条题解
-
0
前置:本题解使用的是手搓链表
思路
链表板子题,主要考察链表的插入删除以及维护头部。
AC Code
千万千万要注意:输入数据时下标要从2开始!
#include<bits/stdc++.h> #define ll long long using namespace std; const ll N=1e5+5; ll n,head=1,m; struct stu{ ll pre=0,next=0; }a[N]; bool flag[N]; int main(){ scanf("%lld",&n); for(ll i=2,k,p;i<=n;i++){ // 下标要从2开始 scanf("%lld%lld",&k,&p); if(p){ a[i].pre=k; a[i].next=a[k].next; a[a[k].next].pre=i; a[k].next=i; }else{ if(k==head) head=i; a[i].next=k; a[i].pre=a[k].pre; a[a[k].pre].next=i; a[k].pre=i; } } scanf("%lld",&m); for(ll i=1,x;i<=m;i++){ scanf("%lld",&x); if(!flag[x]){ if(x==head) head=a[x].next; flag[x]=1; a[a[x].pre].next=a[x].next; a[a[x].next].pre=a[x].pre; } } while(a[head].next) printf("%lld ",head),head=a[head].next; printf("%lld",head); return 0; }
-
0
#include <list> #include <cstdio> #include <cstring> #define N 100007 using namespace std; int main(){ list<int > rander; list<int >::iterator pos[N]; int n, m; bool vis[100007]; scanf("%d",&n); memset(vis, 1, sizeof(vis)); rander.push_front(1); pos[1]=rander.begin(); for (int i = 2; i < n+1; i++) { int k, p; scanf("%d %d",&k, &p); if (p) pos[i] = rander.insert(next(pos[k]),i); else pos[i] = rander.insert(pos[k],i); } scanf("%d",&m); for (int i = 0; i < m; i++) { int temp; scanf("%d",&temp); if (vis[temp]){ rander.erase(pos[temp]); vis[temp] = false; } } for (list<int>::iterator it = rander.begin(); it != rander.end(); it++) { if (it == rander.begin())printf("%d", *it); else printf(" %d", *it); } return 0; }
- 1
信息
- ID
- 714
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 122
- 已通过
- 59
- 上传者