时间限制 | 空间限制 |
---|---|
1000 ms |
65536 KB |
# 题目描述
给定整数序列 和 ,严格递增的非负整数序列 和 ,求解如下多项式:
# 输入格式
第一行一个正整数 (),表示数据组数。
对于每组数据,第一行一个正整数 (),含义同题目描述。
第二行 个整数 (),含义同题目描述。
第三行 个非负整数 (),含义同题目描述。
第四行一个正整数 (),含义同题目描述。
第五行 个整数 (),含义同题目描述。
第六行 个非负整数 (),含义同题目描述。
保证 对 成立, 对 成立, 对 成立。
# 输出格式
对于每组数据,输出三行:
第一行一个正整数 ,表示所得多项式在合并同类项后有 个系数非 项,并设所得多项式为:
其中 对 成立。
第二行 个整数 ,含义同上式。
第三行 个非负整数 ,含义同上式。
# 输入样例
1 | |
3 | |
1 2 3 | |
1 2 3 | |
3 | |
2 3 4 | |
2 3 4 |
# 输出样例
4 | |
1 4 6 4 | |
1 2 3 4 |
# 题解:模拟
写一个仿照归并排序的模拟,就可以很容易地合并同类项。具体参考代码:
#include <stdio.h> | |
int n, m, cnt, a[100010], A[100010], b[100010], B[100010], c[200010], C[200010]; | |
int main() | |
{ | |
// freopen("G.in", "r", stdin); | |
// freopen("G.out", "w", stdout); | |
int T; | |
scanf("%d", &T); | |
while (T -- ) | |
{ | |
cnt = 0; | |
scanf("%d", &n); | |
for (int i = 1; i <= n; ++ i) | |
scanf("%d", &a[i]); | |
for (int i = 1; i <= n; ++ i) | |
scanf("%d", &A[i]); | |
scanf("%d", &m); | |
for (int i = 1; i <= m; ++ i) | |
scanf("%d", &b[i]); | |
for (int i = 1; i <= m; ++ i) | |
scanf("%d", &B[i]); | |
int i = 1, j = 1; | |
while (i <= n && j <= m) | |
{ | |
if (A[i] < B[j]) | |
{ | |
c[ ++ cnt] = a[i]; | |
C[cnt] = A[i]; | |
++ i; | |
} | |
else if (A[i] == B[j]) | |
{ | |
if (a[i] + b[j] != 0) | |
{ | |
c[ ++ cnt] = a[i] + b[j]; | |
C[cnt] = A[i]; | |
} | |
++ i, ++ j; | |
} | |
else | |
{ | |
c[ ++ cnt] = b[j]; | |
C[cnt] = B[j]; | |
++ j; | |
} | |
} | |
while (i <= n) | |
{ | |
c[ ++ cnt] = a[i]; | |
C[cnt] = A[i]; | |
++ i; | |
} | |
while (j <= m) | |
{ | |
c[ ++ cnt] = b[j]; | |
C[cnt] = B[j]; | |
++ j; | |
} | |
printf("%d\n", cnt); | |
for (int i = 1; i <= cnt; ++ i) | |
printf("%d ", c[i]); | |
puts(""); | |
for (int i = 1; i <= cnt; ++ i) | |
printf("%d ", C[i]); | |
puts(""); | |
} | |
return 0; | |
} |