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 |
为啥数组开大了反而WA,first数组开到25000ac,开到30000ac,30006就wa求大神指导啊感激不尽: #include<cstdio> #include<vector> #include<cmath> #include<cstring> #include<iterator> using namespace std; const int maxn=10002; int T,n,root,num,p,q; int rmq[maxn][18],father[maxn],first[30006],h[2*maxn],dfs[2*maxn]; vector<int> children[maxn]; int min(int x,int y) { return x<y? x:y; } void DFS(int x,int depth) { num++; dfs[num]=x; h[num]=depth; rmq[num][0]=num; if (!first[x]) first[x]=num; for (vector<int>::iterator iter=children[x].begin();iter<children[x].end();iter++) { DFS(*iter,depth+1); if (iter==children[x].end()-1) break; num++; dfs[num]=x; h[num]=depth; rmq[num][0]=num; } } void RMQ() { for (int j=1;j<17;j++) { int rl,s; s=1<<(j-1); for (int i=0;i+s-1<=num;i++) { rl=i+s; rmq[i][j]=h[rmq[i][j-1]]<h[rmq[rl][j-1]]? rmq[i][j-1]:rmq[rl][j-1]; } } } void init() { int fa,ch; num=-1; memset(father,0,sizeof(father)); memset(first,0,sizeof(first)); scanf("%d",&n); for (int i=1;i<=n;i++) children[i].clear(); for (int i=1;i<n;i++) { scanf("%d%d",&fa,&ch); father[ch]=fa; children[fa].push_back(ch); } for (int i=1;i<=n;i++) if (father[i]==0) { root=i; break; } DFS(root,0); RMQ(); } int LCA(int x,int y) { int i,j; i=min(first[y],first[x]); if (i==first[x]) j=first[y]; else j=first[x]; int s=log(j-i+1)/log(2); return h[rmq[i][s]]<h[rmq[j-(1<<s)+1][s]]? dfs[rmq[i][s]]:dfs[rmq[j-(1<<s)+1][s]]; } int main () { //freopen("in.in","r",stdin); //freopen("out.out","w",stdout); scanf("%d",&T); for (int i=1;i<=T;i++) { init(); scanf("%d%d",&p,&q); printf("%d\n",LCA(p,q)); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator