Sequence(線段樹 二分)

2022-09-14 12:21:12 字數 2333 閱讀 2920

傳送門

第二次做這種題目,把人做傻了,沒想到是二分,只是隱隱約約感覺到了二分的影子。於是寫了兩個查詢的函式,但是發現查詢的函式無法解決求左邊最大值和右邊最小值的問題。寫了一大堆爛**。

正解只需要在查詢的時候不斷二分就行了。

#include using namespace std;

typedef long long ll;

const int n = 1e5 + 10;

struct nodenode[n << 2];

int n, m, a[n];

void pushup(int root)

void build(int root, int l, int r)

int mid = (l + r) >> 1;

build(root << 1, l, mid);

build(root << 1 | 1, mid + 1, r);

pushup(root);

}void update(int root, int pos, int value)

int mid = (node[root].l + node[root].r) >> 1;

if(pos <= mid)

update(root << 1, pos, value);

else

update(root << 1 | 1, pos, value);

pushup(root);

}/*ll queryleft(int root, int l, int r, int value)

int mid = (node[root].l + node[root].r) >> 1;

if(node[root].l >= l && node[root].r <= r)else if(node[root].maxn < value)else if(node[root].minn < value && node[root].maxn >= value)

}ll ans = -1;

if(l <= mid)

ans = max(ans, queryleft(root << 1, l, r, value));

//cout << "ansleft1 = " << ans << endl;

if(r > mid)

ans = max(ans, queryleft(root << 1 | 1, l, r, value));

//cout << "ansright1 = " << ans << endl;

return ans;

}int queryright(int root, int l, int r, int value)

int mid = (node[root].l + node[root].r) >> 1;

if(node[root].l >= l && node[root].r <= r)else if(node[root].maxn < value)else if(node[root].minn < value && node[root].maxn >= value)

}int ans = 0x3f3f3f3f;

if(l <= mid)

ans = min(ans, queryright(root << 1, l, r, value));

cout << "ansleft2 = " << ans << endl;

if(r > mid)

ans = min(ans, queryright(root << 1 | 1, l, r, value));

cout << "ansright2 = " << ans << endl;

return ans;

}*/ll query(int root, int l, int r)

int mid = (node[root].l + node[root].r) >> 1;

ll ans = 1e9 + 10;

if(l <= mid)

ans = min(ans, query(root << 1, l, r));

if(r > mid)

ans = min(ans, query(root << 1 | 1, l, r));

return ans;

}int main()else

int ansleft = pos - l + 1;

l = pos, r = n + 1;

while(l < r)

int ansright = l - pos;

cout<< (ll)ansleft * ansright << endl;}}

return 0;

}

VVQ 與線段 線段樹 二分

原題鏈結 這題主要是要去判斷2個線段會不會又交集。首先將線段按r從小到大排列,然後乙個乙個放進線段樹裡面方便以後查詢有交集的範圍內的被減數的最小值。然後求交集,若lr與lr有交集,且r是右邊的那個線段。就有l r r,這裡可以使用二分函式lower bound求,主要快一點。然後,交集又分2種情況。...

Work 線段樹 二分答案

開始也想到二分,但是無法判斷哪些天數比它大,比它小 排序啊,人按浪費的時間排序,題按時間排序,下標加入線段樹 include define n 200005 define ll long long using namespace std int m,n,ans n mid,cnt n 4 時間總和 ...

借教室 線段樹and二分

在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。我們需要處理接下來n天的借教室資訊,其中第i天學校有ri個教室可供租借。共有m份訂單,...