| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
折腾好久,终于AC了,说一下自己踩的坑 附代码1.如果是runtime error,需要注意一下题目中给出的条件是k,a的绝对值小于30000,说明k和a有可能是负数。检查一下代码里有没有使用k做数组索引。
2.qsort排序返回值要用减法,不能用比较符号,用比较符号样例数据过了以为没问题,结果一直栽在这里。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 50010
typedef struct _NODE
{
//节点编号,节点值
int k, a;
//父节节点index
int parent;
//左右儿子节点index
int left, right;
}NODE;
NODE node[MAXN];
int stack[MAXN];
int index2node[MAXN];
void build_tree(int n)
{
int stack_pos = -1;
int top = -1;
for (int i = 1; i <= n; i++)
{
while (stack_pos >= 0 && node[stack[stack_pos]].a > node[index2node[i]].a)
{
stack_pos--;
}
if (stack_pos != -1)
{
node[stack[stack_pos]].right = index2node[i];
node[index2node[i]].parent = stack[stack_pos];
}
if (stack_pos < top)
{
node[index2node[i]].left = stack[stack_pos + 1];
node[stack[stack_pos + 1]].parent = index2node[i];
}
stack[++stack_pos] = index2node[i];
top = stack_pos;
}
}
int sort_by_key(const void *a, const void *b)
{
return node[*(int*)a].k - node[*(int*)b].k;
}
int cmp(int a, int b)
{
return node[a].k < node[b].k;
}
int main()
{
int n;
scanf("%d", &n);
memset(node, 0, sizeof(NODE)*(n + 1));
memset(stack, 0, sizeof(int)*(n + 1));
//k有可能是负数!!!!!
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &node[i].k, &node[i].a);
index2node[i] = i;
}
qsort(index2node + 1, n, sizeof(int), sort_by_key);
//sort(index2node + 1, index2node + 1 + n, cmp);
build_tree(n);
printf("YES\n");
for (int i = 1; i <= n; i++)
{
printf("%d %d %d\n", node[i].parent, node[i].left, node[i].right);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator