考慮用總方案數減去空間簡單度不超過 \(k\) 的方案數。
發現 \(k\) 很小,可以列舉所有點 \(i\),那麼對於乙個 \(|i-j|\leq k\) 的點 \(j\),發現這個點對貢獻了路徑 \(i\to j\) 「兩端」點的數量之積。
但是直接計算容易重複,發現每次將是 \(dfs\) 序不超過 3 個區間的點的乘積,那麼求出每個點字數點的 \(dfs\) 序區間,然後扔到二維平面上,轉換成求矩形面積並的問題。
掃瞄線+線段樹即可。
時間複雜度 \(o(nk\log n)\)。
#pragma gcc optimize("ofast")
#pragma gcc optimize("inline")
#include using namespace std;
typedef long long ll;
const int n=300010,lg=20;
int n,m,tot,cnt1,cnt2,head[n],dfn[n],size[n],f[n][lg+1],dep[n],l[n],r[n];
ll ans;
struct edge
e[n*2];
struct node
line1[n*40],line2[n*40];
bool operator
return f[x][0];
}int findson(int x,int y)
void insert(int l1,int l2,int r1,int r2)
; line2[++cnt2]=(node);
}bool cmp(node x,node y)
void update(int x,int ql,int qr,int val)
int mid=(l[x]+r[x])>>1;
if (qr<=mid) update(x*2,ql,qr,val);
else if (ql>mid) update(x*2+1,ql,qr,val);
else update(x*2,ql,mid,val),update(x*2+1,mid+1,qr,val);
if (sum[x]) cnt[x]=r[x]-l[x]+1;
else cnt[x]=cnt[x*2]+cnt[x*2+1];
}}seg;
int main()
else insert(l[i],r[i],l[j],r[j]);
if (flag) swap(i,j);
} seg.build(1,1,n);
sort(line1+1,line1+1+cnt1);
sort(line2+1,line2+1+cnt2);
for (int i=1,j=1,k=1;i<=n;i++)
printf("%lld\n",1ll*n*(n-1)/2ll-ans+n);
return 0;
}
nssl1459 空間簡單度 掃瞄線,線段樹
n nn個點的一顆樹,合法路徑定義為一條路徑上每個點的編號相差大於k kk。求合法路徑數 首先我們可以求不合法的路徑數,這樣我們就有了k n k nk n個不合法 即不能在同乙個路徑上 的點對。然後這題就和之前一題jzoj6276一樣了 大概就是用矩形表示不合法的路徑,之後用掃麵線求矩形的面積並即可...
掃瞄線,線段樹 nssl 1459 空間複雜度
由於 k leq 10 所以考慮用總方案減去經過兩個差的絕對值 leq k 的點的路徑數 分類討論一下發現要處理祖先關係和其它關係兩種情況,考慮怎麼去重,可以將這些答案看作乙個個矩形,然後就是要求矩形的面積並,用掃瞄線 線段樹解決 include include include include de...
簡單介紹 空間複雜度
是什麼?指執行某個演算法所需要的記憶體空間 由於現在科技的發展我們完全可以用空間去換取時間 例 要判斷某年是不是閏年?花點心思來寫乙個演算法,每給乙個年份,就可以通過這個演算法計算得到是否是閏年的結果。事先建立乙個有2050個元素的陣列,然後把所有的年份按下錶的數字對應,如果是閏年,則此陣列元素的值...