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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zzuli 2520: 大小接近的点对

發(fā)布時(shí)間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zzuli 2520: 大小接近的点对 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

題意

給你一棵樹,每個(gè)節(jié)點(diǎn)有一個(gè)權(quán)值。詢問每個(gè)節(jié)點(diǎn)有多少個(gè)點(diǎn)對,滿足以該節(jié)點(diǎn)為根節(jié)點(diǎn)uuu與它的所有子節(jié)點(diǎn)vvv,并且∣val[u]?val[v]∣≤K\left|val[u] - val[v] \right|\leq Kval[u]?val[v]K

思路

  • 比賽的時(shí)候想到一個(gè)思路:就是每次從葉子節(jié)點(diǎn)向根節(jié)點(diǎn)返回,每次把經(jīng)過的點(diǎn)加入集合,并滿足根節(jié)點(diǎn)的數(shù)量。沒時(shí)間寫了,回來實(shí)現(xiàn)一下發(fā)現(xiàn)超時(shí),就可能樹上有一個(gè)長鏈,在底層有很多葉子節(jié)點(diǎn),這樣每次相當(dāng)于便利了一棵樹N2N^2N2的復(fù)雜度。
  • 再次向?qū)W長請教(學(xué)長好厲害啊^ _ ^)。
  • 按照dfsdfsdfs順序維護(hù)一個(gè)樹狀數(shù)組,在剛進(jìn)入節(jié)點(diǎn)的時(shí)候先計(jì)算滿足根節(jié)點(diǎn)的個(gè)數(shù)tmptmptmp,然后對子節(jié)點(diǎn)進(jìn)行dfsdfsdfs,在回溯的時(shí)候插入當(dāng)前點(diǎn)再次統(tǒng)計(jì)滿足根節(jié)點(diǎn)的情況sumsumsum,那么sum?tmpsum - tmpsum?tmp就是當(dāng)前根節(jié)點(diǎn)能與子節(jié)點(diǎn)形成的點(diǎn)對,同時(shí)加上所有子樹的和就是當(dāng)前根節(jié)點(diǎn)的答案。
  • 為什么在第一次進(jìn)入節(jié)點(diǎn)的時(shí)候統(tǒng)計(jì)答案呢?
    剛進(jìn)入節(jié)點(diǎn)的時(shí)候,樹狀數(shù)組已經(jīng)插入了一些節(jié)點(diǎn)的值,而這些值并不是當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn),所以它不會對節(jié)點(diǎn)有貢獻(xiàn)。
  • 權(quán)值很大需要離散。
#include <bits/stdc++.h> #define LL long long #define P pair<int, int> #define lowbit(x) (x & -x) #define mem(a, b) memset(a, b, sizeof(a)) #define mid ((l + r) >> 1) #define lc rt<<1 #define rc rt<<1|1 using namespace std; const int maxn = 1e5 + 7; int tot; vector<int> g[maxn]; LL a[maxn], b[maxn], c[maxn], ans[maxn], n, k; void Add(int x) {x++;while (x <= n) {c[x]++;x += lowbit(x);} } LL Sum(int x) {x++;LL ans = 0;while (x) {ans += c[x];x -= lowbit(x);}return ans; } void dfs(int x) {int l, r;l = lower_bound(b, b + tot, a[x-1]-k) - b - 1;r = upper_bound(b, b + tot, a[x-1]+k) - b - 1;ans[x] -= Sum(r) - Sum(l);LL sum = 0;for (int it : g[x]) {dfs(it);sum += ans[it];}int pos = lower_bound(b, b + tot, a[x-1]) - b;Add(pos);l = lower_bound(b, b + tot, a[x-1]-k) - b - 1;r = upper_bound(b, b + tot, a[x-1]+k) - b - 1;ans[x] += Sum(r) - Sum(l) + sum;return; } int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);scanf("%lld %lld", &n, &k);for (int i = 0; i < n; ++i) {scanf("%lld", &a[i]);b[i] = a[i];}sort(b, b + n);tot = unique(b, b + n) - b;for (int i = 2, x; i <= n; ++i) {scanf("%d", &x);g[x].push_back(i);}dfs(1);for (int i = 1; i <= n; ++i) {printf("%lld\n", ans[i]);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的zzuli 2520: 大小接近的点对的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。