日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树形DP+树状数组 HDU 5877 Weak Pair

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树形DP+树状数组 HDU 5877 Weak Pair 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 //樹形DP+樹狀數組 HDU 5877 Weak Pair 2 // 思路:用樹狀數組每次加k/a[i],每個節點ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 這道題要離散化 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 #define LL long long 8 typedef pair<int,int> pii; 9 const double inf = 123456789012345.0; 10 const LL MOD =100000000LL; 11 const int N = 2e5+10; 12 const int maxx = 200010; 13 #define clc(a,b) memset(a,b,sizeof(a)) 14 const double eps = 1e-7; 15 void fre() {freopen("in.txt","r",stdin);} 16 void freout() {freopen("out.txt","w",stdout);} 17 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;} 18 19 map<LL,LL> ma; 20 LL a[N]; 21 LL c[N],b[N]; 22 LL in[N]; 23 vector<LL> g[N]; 24 LL lowbit(LL x){ return x&(-x);} 25 LL add(LL x,int t){ 26 while(x>0){ 27 c[x]+=t; 28 x-=lowbit(x); 29 } 30 } 31 LL Sum(LL x){ 32 LL sum=0; 33 while(x<maxx){ 34 sum+=c[x]; 35 x+=lowbit(x); 36 } 37 return sum; 38 } 39 40 LL ans=0; 41 LL n,k; 42 void dfs(LL rt){ 43 for(LL i=0;i<(int)g[rt].size();i++){ 44 LL v=g[rt][i]; 45 ans+=Sum(ma[a[v]]); 46 if(a[v]==0) add(maxx,1); 47 else add(ma[k/a[v]],1); 48 dfs(v); 49 if(a[v]==0) add(maxx,-1); 50 else add(ma[k/a[v]],-1); 51 } 52 } 53 int main(){ 54 int T; 55 scanf("%d",&T); 56 while(T--){ 57 ma.clear(); 58 memset(c,0,sizeof(c)); 59 scanf("%I64d%I64d",&n,&k); 60 for(int i=1;i<=n;i++){ 61 scanf("%I64d",&a[i]); 62 b[i*2-2]=a[i]; 63 if(a[i]!=0) b[i*2-1]=k/a[i]; 64 g[i].clear(); 65 in[i]=0; 66 } 67 sort(b,b+2*n); 68 int K=unique(b,b+2*n)-b; 69 int cxt=0; 70 for(int i=0;i<K;i++){ 71 ma[b[i]]=++cxt; 72 } 73 for(LL i=0;i<n-1;i++){ 74 LL u,v; 75 scanf("%I64d%I64d",&u,&v); 76 g[u].push_back(v); 77 in[v]++; 78 } 79 LL rt; 80 for(LL i=1;i<=n;i++){ 81 if(in[i]==0){ 82 rt=i; 83 break; 84 } 85 } 86 ans=0; 87 if(a[rt]==0) add(maxx,1); 88 else add(ma[k/a[rt]],1); 89 dfs(rt); 90 printf("%I64d\n",ans); 91 } 92 return 0; 93 }

?

轉載于:https://www.cnblogs.com/ITUPC/p/5861453.html

總結

以上是生活随笔為你收集整理的树形DP+树状数组 HDU 5877 Weak Pair的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。