CCCC-GPLT L2-002 链表去重 模拟
2018-03-20 21:49
375 查看
模拟一个单链表(1e5, index value next)的去重,把去掉的点构建成一个新表,输出结果表和新表.
首先观察输入输出,不需离散化,结果与顺序无关,考虑排序和序列权值化.
数据结构选用pair<int,int>的数组,下标为index,自然存储了这个模拟的链表.
做两个新的空模拟链表,遍历原链表,分类填入即可.
主要的代码是中间的遍历循环和add函数,比较简单的模拟题,考虑好各种情况即可.
有一个debug点是read()方法是有迷之顺序的,所以不要太图方便,最好用临时变量.
输入样例: 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'); }
相关文章推荐
- 4000 PAT-L2-002. 链表去重(模拟)
- CCCC-GPLT L2-021. 点赞狂魔 模拟
- 团体程序设计天梯赛L2-002 链表去重(模拟)
- CCCC-GPLT L2-018. 多项式A除以B 模拟
- L2-002. 链表去重(模拟)
- PAT L2-002. 链表去重 模拟
- PAT ~ L2-002. 链表去重 (思路 + 模拟)
- 【天梯赛】L2-002. 链表去重(数组模拟)
- L2-002. 链表去重(模拟)
- 数组模拟链表运作!!L2-002. 链表去重
- L2-002. 链表去重---模拟
- CCCC-GPLT L2-015. 互评成绩 模拟
- CCCC-GPLT L2-022. 重排链表 链表,模拟
- CCCC题集 L2-002. 链表去重 ( 简单模拟
- GPLT L2-002. 链表去重【链表】
- PATL2-002. 链表去重(模拟)
- 【L2-002. 】链表去重 【模拟】
- 【002】链表或字符串模拟加法/加一/乘法
- 用数组模拟双向链表
- codeforces 899 E - Segments Removal(链表模拟)