fork download
  1. # your code goes here
  2. from sys import stdin, setrecursionlimit as srl
  3. srl(int(1e6)+7)
  4. ip=stdin.readline
  5. n=int(ip())
  6. a=list(map(int, ip().split()))
  7. b=list(map(int, ip().split()))
  8. adj=[[] for _ in range(n)]
  9. for i in range(n):
  10. if not b[i]==-1:
  11. adj[i].append(b[i]-1)
  12.  
  13. visited=[0]*n
  14. stk=[]
  15. for x in range(n):
  16. def topsort(v):
  17. if visited[v]==2: return
  18. visited[v]=1
  19. for i in adj[v]:
  20. topsort(i)
  21. visited[v]=2
  22. stk.append(v)
  23. if not visited[x]: topsort(x)
  24.  
  25. laterstk=[]#later stack
  26. extra=[0]*n
  27. ans=0; soln=[]
  28.  
  29. while stk:
  30. i=stk.pop()
  31. if (a[i]+extra[i])<0: laterstk.append(i)
  32. else:
  33. ans+=a[i]+extra[i]
  34. if len(adj[i])==1:
  35. j=adj[i][0]
  36. extra[j]+=extra[i]+a[i]
  37. soln.append(i+1)
  38.  
  39. while laterstk:
  40. i=laterstk.pop()
  41. ans+=a[i]+extra[i]
  42. soln.append(i+1)
  43.  
  44.  
  45. print(ans)
  46. print(*soln)
Success #stdin #stdout 0.02s 9268KB
stdin
10
-10 -1 2 2 5 -2 -3 -4 2 -6
-1 -1 2 2 -1 5 5 7 7 9
stdout
-9
9 5 4 3 2 1 6 7 8 10