原題鏈結
這題主要是要去判斷2個線段會不會又交集。首先將線段按r從小到大排列,然後乙個乙個放進線段樹裡面方便以後查詢有交集的範圍內的被減數的最小值。
然後求交集,若lr與lr有交集,且r是右邊的那個線段。就有l<=r<=r,這裡可以使用二分函式lower_bound求,主要快一點。
然後,交集又分2種情況。
第一種是lr與lr相交於左邊,答案就是(r-l)-(r-l)
第二種是lr在lr裡面,答案是(r+l)-(r+l);
要答案最大,那麼就要第一種的(r-l)最小,或者第二種的(r+l)最小。(因為此時的l與r是已知的)
#include#include#include#include#include#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
const int inf=0x3f3f3f3f;
const int mx=2e5+9;
using namespace std;
struct nodenode[mx];
int r[mx],t[mx<<2],t1[mx<<2],res1,res2; // t存了(l+r),t1存了(r-l)
bool cmp(node a,node b)
}void build(int k,int l,int r)
int mid=(l+r)>>1;
build(lson);
build(rson);
t[k]=min(t[k<<1],t[k<<1|1]);
t1[k]=min(t1[k<<1],t1[k<<1|1]);
}void que(int k,int l,int r,int l,int r)
int mid=(l+r)>>1;
if( l<=mid )
que(lson,l,r);
if( midque(rson,l,r);
}int n;
int main()
sort(node+1,node+n+1,cmp);
sort(r+1,r+n+1);
build(1,1,n);
for( int i=1 ; i<=n ; i++ )
printf("%d\n",ans);
}return 0;
}
Sequence(線段樹 二分)
傳送門 第二次做這種題目,把人做傻了,沒想到是二分,只是隱隱約約感覺到了二分的影子。於是寫了兩個查詢的函式,但是發現查詢的函式無法解決求左邊最大值和右邊最小值的問題。寫了一大堆爛 正解只需要在查詢的時候不斷二分就行了。include using namespace std typedef long ...
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份訂單,...