您的位置:首页 > 其它

CCCC-GPLT L2-002 链表去重 模拟

2018-03-20 21:49 375 查看
模拟一个单链表(1e5, index value next)的去重,把去掉的点构建成一个新表,输出结果表和新表.

输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1


首先观察输入输出,不需离散化,结果与顺序无关,考虑排序和序列权值化.

数据结构选用pair<int,int>的数组,下标为index,自然存储了这个模拟的链表.

做两个新的空模拟链表,遍历原链表,分类填入即可.

主要的代码是中间的遍历循环和add函数,比较简单的模拟题,考虑好各种情况即可.

有一个debug点是read()方法是有迷之顺序的,所以不要太图方便,最好用临时变量.

/* LittleFall : Hello! */
#include <bits/stdc++.h>
#define ll long long
#define value first
#define next second
using namespace std;
inline int read();
inline void write(int x);
const int M = 100016;
pair<int, int> save[M], ans1[M], ans2[M];
int visit[M];
int add(pair<int, int> arr[], int nex, int now)
{
if(now != -1)
arr[now].next = nex;
arr[nex].value = save[nex].value;
arr[nex].next = -1;
return nex;
}
void printAns(pair<int, int> arr[], int now)
{
<
4000
span class="hljs-keyword">while(now != -1)
{
if(arr[now].next==-1)
printf("%05d %d %d\n", now, arr[now].value, arr[now].next);
else
printf("%05d %d %05d\n", now, arr[now].value, arr[now].next);
now = arr[now].next;
}
}
int main(void)
{
#ifdef _LITTLEFALL_
freopen("in.txt", "r", stdin);
#endif
//std::cin.sync_with_stdio(false);

int start = read(), n = read();
for(int i = 0; i < n; i++)
{
int ta=read(),tb=read(),tc=read();
save[ta] = {tb, tc};
}

int start1 = start, start2 = -1;
int now = start, now1 = -1, now2 = -1;
while(now != -1)
{
//printf("now=%d next=%d\n",now,save[now].next);
int val = abs(save[now].value);
if(visit[val])
{
if(start2 == -1)
start2 = now;
now2 = add(ans2, now, now2);
}
else
{
now1 = add(ans1, now, now1);
visit[val]++;
}
now = save[now].next;
}
now1 = start1, now2 = start2;
printAns(ans1,now1);
printAns(ans2,now2);

return 0;
}

inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void write(int x)
{
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: