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 |
按k排序了,从最右找为什么还是tle,牛人帮忙看一下啊!!#include <iostream> #include <algorithm> #include <vector> using namespace std; struct Node { int k,a; int par; int index; int l,r; }; vector<Node> p(50001); bool Cmp(Node a, Node b) { return a.k<b.k; } bool Cmp1(Node a, Node b) { return a.index<b.index; } void MakeTree(int l, int h) { for(int i=l+1;i<=h;i++) { int cur = i-1, son = 0; while(p[cur].a > p[i].a) son = cur, cur = p[cur].par;//从最右找到合适位置 //父节点(par),左右结点暂时记录按k排序后 //相应结点的数组下标; if(son == 0) { p[cur].r = i; p[i].par = cur; } else if(cur == 0) { p[i].l = son; p[son].par = i; } else { p[cur].r = i; p[i].par = cur; p[son].par = i; p[i].l = son; } } for(int i=l;i<=h;i++) { //将数组下标转化为index p[i].par = p[p[i].par].index; p[i].l = p[p[i].l].index; p[i].r = p[p[i].r].index; } } int main() { int n; scanf("%d", &n); for(int i=1;i<=n;i++) { scanf("%d %d", &p[i].k, &p[i].a); p[i].index = i; } sort(p.begin()+1, p.begin()+n+1, Cmp);//按k排序 MakeTree(1, n); sort(p.begin()+1, p.begin()+n+1, Cmp1);//按index排序 printf("YES\n"); for(int i=1;i<=n;i++) printf("%d %d %d\n", p[i].par, p[i].l, p[i].r); } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator