SSLOJ1459 空間簡單度

2022-06-13 22:12:15 字數 1583 閱讀 6895

考慮用總方案數減去空間簡單度不超過 \(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個元素的陣列,然後把所有的年份按下錶的數字對應,如果是閏年,則此陣列元素的值...