有乙個數列a[1~n]中 (數字各不相同),輸入m行i,j,k,目的是求a[i...j]之間第k小的數
#includeusing namespace std;
typedef long long ll;
const int n=1e6+5;
ll n,m,a[n];
vectort[n];
void pushup(int k)
void build(int l, int r, int k)
int m=l+r>>1;
build(l,m,k<<1);
build(m+1,r,k<<1|1);
t[k].resize(r-l+1);
pushup(k);
}int ask(int ql, int qr, int l, int r, int k, ll num)
int m=l+r>>1, ans=0;
if (m>=ql) ans+=ask(ql,qr,l,m,k<<1,num);
if (m>1;
if (ask(s,e,1,n,1,m)>n>>m; for (int i=1; i<=n; i++) cin>>a[i];
build(1,n,1);
for (int i=0; i>l>>r>>k;
cout<建樹複雜度:遍歷了logn層,每層的merge函式累積遍歷n個元素
查詢複雜度:mloglog(e-s)
感覺比按雙字段排序還要慢一點...
hdu4614 二分 線段樹
題意 給你1 n的花瓶 剛開始全是空的,現在有兩種操作,1 從花瓶a開始插入b朵花 如果不能插進去 輸出字串 否則輸出最多插入的起點和終點 結構體陣列num i 表示節點i空瓶的數目 線段樹 開始deal函式對整個樹初始化,update 更新函式 find 查詢區間有多少個空瓶 對於操作1 關鍵點是...
HDU 5649 二分 線段樹
題意 給出乙個排列,每次操作 l,r 區間的數原地公升序或者降序,詢問最後k下標的數。二分最後的結果mid,然後把比mid大的換成1,小於等於mid的換成0,那麼公升序降序相當於求出區間中0的個數然後把前半段和後半段分別用0 1覆蓋。這樣只需要維護乙個區間查詢,區間修改的線段樹即可。include ...
Codeforces460C 二分 線段樹
二分最小值,如果你能實現這個最小值是可以實現的,那麼一定是最優的,因為每次區間 1,原來存在的最小值的個數還是存在的,但是新的可能會多起來,所以最小值遞增還是最優到最優的 考慮如果不能實現這個最小值,那麼他一定是比之前這個值少的,因為最小值不變,而且個數變少 區間維護可以線段樹。include us...