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 |
居然是第100道题了呀~贴代码留念~#include <stdio.h> using namespace std; int prime[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int ans_num = 0; int ans_fnum = 0; int n; int k; void dfs(int num, int fnum, int index, int pnum) { if(fnum > ans_fnum) { ans_fnum = fnum; ans_num = num; } if(fnum == ans_fnum && num < ans_num) { ans_num = num; } if(index == 10 || pnum == 0) { return; } for(int i = 1, j = 0; num*i <= n && j <= pnum; i *= prime[index+1], j++) { dfs(num*i, fnum*(j+1), index+1, j); } } #define N 500000 struct data { int offset; char name[11]; }; struct node { int l; int r; int p; int empty; }; data dict[N] = {}; node all[N*2] = {}; int now = 0; int add_node(int p, int empty) { node &n = all[now]; n.l = -1; n.r = -1; n.p = p; n.empty = empty; now++; return now-1; } int build_tree(int p, int left, int right) { int nowi = add_node(p, right-left+1); if(left == right) { return nowi; } else { int mid = (left+right)/2; all[nowi].l = build_tree(nowi, left, mid); all[nowi].r = build_tree(nowi, mid+1, right); return nowi; } } int empty_node(int offset, int nowi, int left, int right) { node &n = all[nowi]; n.empty--; if(left == right) { return left; } else { node &l = all[n.l]; int mid = (left+right) / 2; if(offset < l.empty) { return empty_node(offset, n.l, left, mid); } else { return empty_node(offset-l.empty, n.r, mid+1, right); } } } int query_empty(int nowl, int nowr, int nowi, int left, int right) { node &n = all[nowi]; if(nowl == left && nowr == right) { return n.empty; } else { int nowmid = (nowl+nowr)/2; if(left >= nowmid+1) { return query_empty(nowmid+1, nowr, n.r, left, right); } else if(right <= nowmid) { return query_empty(nowl, nowmid, n.l, left, right); } else { return query_empty(nowl, nowmid, n.l, left, nowmid) + query_empty(nowmid+1, nowr, n.r, nowmid+1, right); } } } int get_offset(int le, int re, int nowoff) { int sum = le+re; if(nowoff > 0) { return (le+nowoff-1)%sum; } else { return (sum-1)-(re-nowoff-1)%sum; } } int main() { while(scanf("%d %d", &n, &k) != EOF) { ans_num = 1; ans_fnum = 1; for(int i = 1, j = 0; i <= n; i *= 2, j++) { dfs(i, j+1, 0, j); } for(int i = 0; i < n; i++) { scanf("%s %d", dict[i].name, &dict[i].offset); } int root = build_tree(-1, 0, n-1); int abs_off = k-1; for(int i = 0; i < ans_num-1; i++) { int index = empty_node(abs_off, root, 0, n-1); int le = query_empty(0, n-1, root, 0, index); int re = query_empty(0, n-1, root, index, n-1); int relative_off = dict[index].offset; abs_off = get_offset(le, re, relative_off); } int res = empty_node(abs_off, root, 0, n-1); printf("%s %d\n", dict[res].name, ans_fnum); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator