線段樹 穩定桌

2021-10-07 21:07:44 字數 1595 閱讀 9415

沒想到線段樹可以做這種題。。。這道題通過列舉留最高的桌子,首先比這個高的桌子肯定全沒了,剩下的如果這個桌子的數量已經大於2倍那就不用再砍腳了,如果不夠那麼就砍掉前k小權值的桌腳。所以線段樹維護的權值l到r區間內的數量和權值和。這道題也可以用權值線段樹來做,之後來補上來。

#include

#define int long long

using

namespace std;

#define lson u<<1

#define rson u<<1|1

const

int n=

1e5+10;

int a[n]

,b[n]

,cnt[n]

,sum[n]

;vector<

int> g[n]

;struct node

tr[n<<2]

;void

pushup

(int u)

void

build

(int u,

int l,

int r);if

(l==r)

return

;int mid=l+r>>1;

build

(lson,l,mid)

,build

(rson,mid+

1,r);}

intquery

(int u,

int k)

if(tr[lson]

.num==k)

return tr[lson]

.sum;

else

if(tr[lson]

.num>=k)

return

query

(lson,k)

;else

return tr[lson]

.sum+

query

(rson,k-tr[lson]

.num);}

void

modify

(int u,

int x)

int mid=tr[u]

.l+tr[u]

.r>>1;

if(x<=mid)

modify

(lson,x)

;else

modify

(rson,x)

;pushup

(u);

}signed

main()

for(

int i=

1;i<=maxa;i++

)build(1

,1,maxn)

;int ans=

1e18

;for

(int i=

1;i<=maxa;i++

)else

for(

int j=

0;j.size()

;j++

)modify(1

,g[i]

[j]);}

printf

("%lld\n"

,ans)

;}

51nod 1461 穩定桌 掃瞄線 線段樹

有一張桌子,有n個腿。第i根腿的長度是li。現在要拿掉一些腿,使得桌子穩定,拿掉第i根腿需要di的能量。穩定的條件是,假如拿掉若干條腿之後,桌子還有k個腿,那麼長度最長的腿的數目要超過一半。比如桌子有5根腿,那麼至少要有三根腿是最長的。另外,只有一根腿的桌子是穩定的,兩個腿的桌子想要穩定,必需長度是...

線段樹 02 構建線段樹

public inte ce merger 不能再縮小的基本問題是 對treeindex指向的節點的情況進行討論 public class segmenttree 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treei...

線段樹 01 線段樹基礎

物理上 public class segmenttree public int getsize public e get int index 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引 private int leftchild int index 返回完全二叉樹的陣列表示中...