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より大きい値が入っていた場合は更新されると困るのでそこを調整しました。
#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;
}