一道權值線段樹的題:也不算是板子題,變相求第k大
題解:
由於資料範圍比較大,所以需要離散化,二分+vector
是我目前已知的最快的一種方法,這題就是乙個變相求第k大問題,然後用佇列模擬一下指令輸入即可
ac**:
#include
#include
using namespace std;
#include
#include
#include
using namespace std;
//求第k大
const int maxn=
1e4+5;
int a[maxn]
;vector<
int>vec;
int getid(
int x)
//離散化
struct node
tree[maxn*4]
;//這裡需要注意一下,需要開大一點,不然就wa了
void pushup(
int k)
void build(
int k,
int l,
int r)
int mid=
(l+r)
>>1;
build(k<<
1,l,mid)
; build(k<<1|
1,mid+
1,r);}
void update(
int k,
int pos,
int w)
int mid=
(tree[k]
.l+tree[k]
.r)>>1;
if(mid>=pos)
update(k<<
1,pos,w)
;else
update(k<<1|
1,pos,w)
; pushup(k);}
int query_kth(
int k,
int ik)
if(tree[k<<1]
.sum
>=ik)
return query_kth(k<<
1,ik)
;else
return query_kth(k<<1|
1,ik-tree[k<<1]
.sum);
}int main(
)else
if(op[0]
=='o'
)else
if(op[0]
=='q')}
sort(vec.begin(
),vec.end())
; vec.erase(unique(vec.begin(
),vec.end())
,vec.end())
;//printf(
"%d\n"
,vec.size())
; build(1,
1,vec.size())
; printf(
"case #%d:\n",+
+id);
for(
int i=
1; i<=n; i++)
if(a[i]==-
1)else
if(a[i]==-
2)}//printf(
"%d\n"
,que.size())
;}}
KPI(HDU 5249)權值線段樹
你工作以後,kpi 就是你的全部了.我開發了乙個服務,取得了很大的知名度。數十億的請求被推到乙個大管道後同時服務從管頭拉取請求。讓我們來定義每個請求都有乙個重要值。我的kpi是由當前管道內請求的重要值的中間值來計算。現在給你服務記錄,有時我想知道當前管道內請求的重要值得中間值。有大約100組資料。每...
權值線段樹
維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...
權值線段樹
include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...