1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| import java.util.*; public class ttree { static int n,s; static int []a; static long res=0; static List<Integer>[]g; static int[]tr; static void modify(int i,int val) { while(i<=n) { tr[i]+=val; i+=i&-i; } } static int query(int i) { int sum=0; while(i>0) { sum+=tr[i]; i-=i&-i; } return sum; } static int sum(int i) { return query(n)-query(i); } static void dfs(int u,int fa) { modify(a[u],1); for(int v:g[u]) { if(v!=fa) { dfs(v,u); } } for(int k=2;k*a[u]<=n;k++) { int t=k*a[u]; res-=query(t)-query(t-1); } res+=sum(a[u]); modify(a[u], -1); }
public static void main(String[] args) { Scanner scan=new Scanner(System.in); n=scan.nextInt(); s=scan.nextInt(); a=new int[n+1]; g=new ArrayList[n+1]; tr=new int[n+1]; Arrays.fill(tr,0); for(int i=1;i<=n;i++) { a[i]=scan.nextInt(); g[i]=new ArrayList<>(); } for(int i=0;i<n-1;i++) { int u=scan.nextInt(); int v=scan.nextInt(); g[u].add(v); g[v].add(u); } dfs(s,-1); System.out.println(res); } }
|