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 |
貌似转成RMQ数据量小了有点慢。。。我79ms。。。 不知道用±1RMQ的O(n)方法会怎么样。。。In Reply To: 最近一直挫败……好不容易用rmq一次ac了一题,纪念一下,帖下代码 Posted by:fyq at 2010-05-11 13:39:17 #include <cstdio> #include <cstring> #include <vector> #include <cmath> #define MIN(a,b) (a < b ? a : b) #define MAX(a,b) (a > b ? a : b) using namespace std; const int SIZE = 20480; int nv; int elc; bool used[SIZE]; int level[SIZE]; int euler[SIZE]; int first[SIZE]; int ances[SIZE]; int dp[SIZE][15]; vector<int> gmap[SIZE]; void fillTable(int n) { for (int i = 0;i < n;i++) dp[i][0] = i; for (int j = 1;1 << j <= n;j++) for (int i = 0;i + (1 << j) - 1 < n;i++) if (level[dp[i][j-1]] < level[dp[i+(1<<(j-1))][j-1]]) dp[i][j] = dp[i][j-1]; else dp[i][j] = dp[i+(1<<(j-1))][j-1]; } int rmq(int i,int j) { int k = (int)floor(log(j-i+1)/log(2)); return level[dp[i][k]] < level[dp[j-(1<<k)+1][k]] ? dp[i][k] : dp[j-(1<<k)+1][k]; } void dfs(int u,int depth) { level[elc] = depth; euler[elc++] = u; int size = gmap[u].size(); for (int i = 0;i < size;i++) { dfs(gmap[u][i],depth + 1); level[elc] = depth; euler[elc++] = u; } } int main () { int x; int y; int cas; scanf("%d",&cas); for (int cc = 0;cc < cas;cc++) { memset(used,true,sizeof(used)); scanf("%d",&nv); for (int i = 0;i < nv;i++) gmap[i].clear(); for (int i = 0;i < nv - 1;i++) { scanf("%d %d",&x,&y); gmap[x-1].push_back(y-1); used[y-1] = false; } elc = 0; for (int i = 0;i < nv;i++) if (used[i]) { dfs(i,0); break; } memset(used,false,sizeof(used)); for (int i = 0;i < elc;i++) if (!used[euler[i]]) { first[euler[i]] = i; used[euler[i]] = true; } fillTable(2 * nv - 1); scanf("%d %d",&x,&y); printf("%d\n",euler[rmq(MIN(first[x-1],first[y-1]),MAX(first[x-1],first[y-1]))] + 1); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator