生活随笔
收集整理的這篇文章主要介紹了
XKC's basketball team(2019徐州站网络赛E线段树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:題目鏈接嚶嚶嚶
一開始以為是主席樹,想明白了之后線段樹就可以。從后往前遍歷,線段樹二分查找離這個數最遠的數字。返回那個數的下標。這個數查找完了就把這個數插入到線段樹里。
代碼如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;const int maxx
=5e5+100;
struct node
{int l
;int r
;int sum
;
}p
[maxx
<<3];
ll a
[maxx
];int ans
[maxx
];
ll b
[maxx
];
int n
,m
;inline int getid(ll x
,int len
)
{return lower_bound(b
+1,b
+1+len
,x
)-b
;
}
inline void pushup(int cur
)
{p
[cur
].sum
=max(p
[cur
<<1].sum
,p
[cur
<<1|1].sum
);
}
inline void build(int l
,int r
,int cur
)
{p
[cur
].l
=l
;p
[cur
].r
=r
;p
[cur
].sum
=0;if(l
==r
) return ;int mid
=l
+r
>>1;build(l
,mid
,cur
<<1);build(mid
+1,r
,cur
<<1|1);
}
inline void update(int pos
,ll v
,int cur
)
{int L
=p
[cur
].l
;int R
=p
[cur
].r
;if(L
==R
){p
[cur
].sum
=v
;return ;}int mid
=L
+R
>>1;if(pos
<=mid
) update(pos
,v
,cur
<<1);else update(pos
,v
,cur
<<1|1);pushup(cur
);
}
inline int query(ll v
,int cur
)
{if(p
[cur
].sum
<v
) return 0;int L
=p
[cur
].l
;int R
=p
[cur
].r
;if(L
==R
) return L
;int ans
=0;if(p
[cur
<<1|1].sum
>=v
) ans
= query(v
,cur
<<1|1);if(ans
==0) ans
= query(v
,cur
<<1);return ans
;
}
int main()
{while(~scanf("%d%d",&n
,&m
)){int cnt
=0;for(int i
=1;i
<=n
;i
++) scanf("%lld",&a
[i
]);build(1,n
,1);for(int i
=n
;i
>=1;i
--){int x
=query(a
[i
]+m
,1);ans
[i
]=x
?x
-i
-1:-1;update(i
,a
[i
],1);}for(int i
=1;i
<=n
;i
++) printf("%d%c",ans
[i
],i
==n
?'\n':' ');}
}
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的XKC's basketball team(2019徐州站网络赛E线段树)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。