hdu 6621
思路:每次查詢第k小,只有p在改變,所以我們可以列舉p的左右範圍,因為題目中保證每個值都不同,
所以省略離散化,直接建立主席樹,二分尋找p的左右範圍,就是最終的答案。
#include using namespace std;
const int maxn = 1e6+10;
int a[maxn],n,m,cnt,root[maxn];
struct node
tree[maxn*40];
vector vc;
int getid(int x)
void build(int &rt,int l,int r)
void update(int num,int &rt,int lt,int l,int r)
int query(int i,int j,int k1,int k2,int l,int r)
int mid = (l+r)>>1,ans = 0;
if(k1<=mid) ans += query(tree[i].l,tree[j].l,k1,k2,l,mid);
if(k2>mid) ans += query(tree[i].r,tree[j].r,k1,k2,mid+1,r);
return ans;
}int main(void)
int ans = 0;
while(m--)
else
}printf("%d\n",ans);}}
return 0;
}
hdu 6621 主席樹 二分
題意 給乙個陣列a,每次詢問,給定l,r,p,k,求 l r 中的數與p做差的絕對值的第k小。思路 對陣列a建立主席樹 不用離散化 對於每次詢問,二分答案,如果 l r 區間中的 p mid p mid 範圍內的數大於k,則說明二分的答案偏大,需要縮小區間 如果等於k,也需要縮小,因為要找到精確的值...
HDU 6621 主席樹 二分優化
這本來應該是多校的時候用來救命的一道資料結構水題,結果當時不知道是測評機有問題還是我 不夠簡單,15s都tle了,當時很慌,也沒細想,後來重寫了一遍,6s不到過了。題意很好理解,乙個陣列,我問你某一子區間內所有數和p pp的差值裡,第k kk小的是多少?首先,這題主席樹基本不難想,要是不會主席樹可以...
hdu2665(主席樹模板題)
求區間第 k 小。參考這類題目做法挺多的,例如 劃分樹。這裡使用主席樹再寫一發,不得不說主席樹相比而言要好寫的多,比起普通線段樹,主席樹就是復用了線段樹共有的資訊。可持久化資料結構講究的就是復用共有的資訊,可持久化 trie 的思想也是差不多的。includeusing namespace std ...