hdu 2795区間の最も値の位置を探します
2994 ワード
問題がよくわかる
updateとqueryがマージされた2つのセグメントツリーが参照されているだけを書きました.そして分かれて最初に書いた
木の配列を書こうと思っていたのですが、区間最値の更新位置がどうなるか、いきなりゆっくりしてしまいます.牛が教えてくれることを願っています.
合併の参考のネット上の
updateとqueryがマージされた2つのセグメントツリーが参照されているだけを書きました.そして分かれて最初に書いた
木の配列を書こうと思っていたのですが、区間最値の更新位置がどうなるか、いきなりゆっくりしてしまいます.牛が教えてくれることを願っています.
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 222222;
int h , w , n;
int MAX[maxn<<2];
void PushUP(int rt) {
MAX[rt] = max(MAX[rt<<1] , MAX[rt<<1|1]);
}
void build(int l,int r,int rt) {
MAX[rt] = w;
if (l == r) return ;
int m = (l + r) >> 1;
build(lson);
build(rson);
}
void update(int x,int l,int r,int rt) {
if (l == r) {
MAX[rt] -= x;
return ;
}
int m = (l + r) >> 1;
(MAX[rt<<1] >= x) ? update(x , lson) : update(x , rson);
PushUP(rt);
}
int query(int x,int l,int r,int rt) {
if (l == r) {
// MAX[rt] -= x;
return l;//RETURN L
}
int m = (l + r) >> 1;
// ( ) X ( )
int ret = (MAX[rt<<1] >= x) ? query(x , lson) : query(x , rson);
//PushUP(rt);
return ret;
}
int main() {
while (~scanf("%d%d%d",&h,&w,&n))
{
if (h > n) h = n;
build(1 , h , 1);
// , W
while (n --)
{
int x;
scanf("%d",&x);
if (MAX[1] < x) puts("-1");
else
{
printf("%d
",query(x , 1 , h , 1));
// updat query
update(x,1,h,1);
}
}
}
return 0;
}
合併の参考のネット上の
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 222222;
int h , w , n;
int MAX[maxn<<2];
void PushUP(int rt) {
MAX[rt] = max(MAX[rt<<1] , MAX[rt<<1|1]);
}
void build(int l,int r,int rt) {
MAX[rt] = w;
if (l == r) return ;
int m = (l + r) >> 1;
build(lson);
build(rson);
}
int query(int x,int l,int r,int rt) {
if (l == r) {
// w
MAX[rt] -= x;
// , L
return l;
}
int m = (l + r) >> 1;
//query update ,
int ret = (MAX[rt<<1] >= x) ? query(x , lson) : query(x , rson);
PushUP(rt);
return ret;
}
int main() {
while (~scanf("%d%d%d",&h,&w,&n)) {
if (h > n) h = n;
build(1 , h , 1);
while (n --) {
int x;
scanf("%d",&x);
if (MAX[1] < x) puts("-1");
else printf("%d
",query(x , 1 , h , 1));
}
}
return 0;
}