记录编号 201350 评测结果 AAAAAAAAAA
题目名称 [河南省队2012] 座位问题 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.234 s
提交时间 2015-10-30 17:17:14 内存使用 7.78 MiB
显示代码纯文本
  1. #include<cstdio>
  2. using namespace std;
  3. #define maxn 100010
  4. struct dd{
  5. int begin,end,next;
  6. }jie[maxn*3];
  7. int Ans[maxn],dfn[maxn],low[maxn],c[maxn],p[maxn];
  8. int n,times,head[maxn],tot;
  9. bool vis[maxn];
  10. inline int in(){
  11. int TEMP,EPX;
  12. TEMP=0;EPX=getchar();
  13. while(EPX<48||EPX>57)
  14. EPX=getchar();
  15. for(;EPX>47&&EPX<58;EPX=getchar())
  16. TEMP=(TEMP<<3)+(TEMP<<1)+EPX-48;
  17. return TEMP;
  18. }
  19.  
  20. void add(int x,int y){
  21. jie[++tot].end=y; jie[tot].next=head[x]; head[x]=tot;
  22. }
  23. int lowbit(int x){
  24. return x&(-x);
  25. }
  26. void dfs(int x){
  27. dfn[x]=++times;vis[x]=1;
  28. for(int i=head[x];i;i=jie[i].next){
  29. if(!vis[jie[i].end]) dfs(jie[i].end);
  30. }
  31. low[x]=times;
  32. }
  33. void update(int x,int y){
  34. for(int i=x;i<=times;i+=lowbit(i)) c[i]+=y;
  35. return;
  36. }
  37. inline int Que(int x){
  38. int sum=0;
  39. for(int i=x;i>0;i-=lowbit(i)) sum+=c[i];
  40. return sum;
  41. }
  42. int main(){
  43. freopen("seat.in","r",stdin);
  44. freopen("seat.out","w",stdout);
  45. n=in();
  46. for(int i=1;i<n;++i){
  47. int x,y;
  48. x=in();y=in();
  49. add(x,y);add(y,x);
  50. }
  51. for(int i=1;i<=n;++i) p[i]=in();
  52. dfs(1);
  53. for(int i=1;i<=n;++i){
  54. Ans[i]=Que(dfn[p[i]]);
  55. update(dfn[p[i]]+1,1); update(low[p[i]]+1,-1);
  56. }
  57. for(int i=1;i<=n;++i) printf("%d\n",Ans[i]);
  58. getchar();getchar();
  59. return 0;
  60. }