ZOJ 3381 Osaisen Choudai!

アバター
五反田
記事: 21
登録日時: 15年前
住所: 千葉

ZOJ 3381 Osaisen Choudai!

投稿記事 by 五反田 » 14年前

問題
http://acm.zju.edu.cn/onlinejudge/showP ... mCode=3381

roxion1377さんのところ(http://dixq.net/forum/blog.php?b=897)で、取り上げられていたので、いろいろと調べて書いてみました。
セグメント木というのを使う解き方があるようです。
データ構造の勉強は大切ということでしょうかね。

以下のサイトを参考にしました。というかほぼもろパクr(ry

http://d.hatena.ne.jp/iakasT/20100831/1283220657

違うのは、最大値を取り出さなくてはいけないのでそこを変更したのと、
update関数では代入先にxより大きい値が入っていた場合は更新されると困るのでそこを調整しました。

CODE:

#include 
#include 
#include 
using namespace std;

const int MAX_N=50000;//max day
int n2;
int dp[MAX_N*4];

void update(int i,int x){
	i+=n2-1;
	if(dp[i]0){
		i=(i-1)/2;
		dp[i]=max(dp[i*2+1],dp[i*2+2]);
	}
}

int query(int a,int b,int k,int l,int r){
	int ret;
	if(r> n) {
		memset(dp,0,sizeof(dp));
		
		vector s(n), x(n), y(n);
		for (int i = 0; i > s[i] >> x[i] >> y[i];
		}
		
		n2=1;
		while(n2=n)update(i,s[i]);
			else update(i,s[i]+query(i+x[i],min(i+y[i],n),0,0,n2));
		}
		
		std::cout << dp[n2-1] << std::endl;
	}
	return 0;
}
最後に編集したユーザー 五反田 on 2010年12月18日(土) 11:38 [ 編集 2 回目 ]

xxx
記事: 26
登録日時: 15年前

Re: ZOJ 3381 Osaisen Choudai!

投稿記事 by xxx » 14年前

プライオリティキュー使って頑張ってた私の苦労は・・・
セグメント木なんて初めて知りました
まだまだだなぁー

この解き方は木から大きい数を取り出してDPしてるのかな?
データ構造は自分で考えることが多くて勉強になりますが理解に時間がかかりますね

アバター
五反田
記事: 21
登録日時: 15年前
住所: 千葉

Re: ZOJ 3381 Osaisen Choudai!

投稿記事 by 五反田 » 14年前

>>roxion1377さん
セグメント木なんて、自分も問題出されて調べるまで知りませんでした。

スライドのほうの解説が結構分かりやすいと思うので、こちらのソースを読むより自分で実装してみるほうが理解できるかもしれませんよ。

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: ZOJ 3381 Osaisen Choudai!

投稿記事 by みけCAT » 14年前

問題文へのリンクもここに書いてあると親切だと思います。
「roxion1377さんのところ」というリンクも、「リクエストされた日記は存在しません。」となります。

アバター
五反田
記事: 21
登録日時: 15年前
住所: 千葉

Re: ZOJ 3381 Osaisen Choudai!

投稿記事 by 五反田 » 14年前

>>みけCATさん
指摘ありがとうございます。
修正しました。