結果

提出番号 415
提出者 Pulmn
言語 C++
提出日時 2017-07-17 11:10:42
問題名 (25)Range of Influence
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 1ms 7520KB
2 AC 100% 1ms 8192KB
3 AC 100% 1ms 7504KB
4 AC 100% 2ms 8304KB
5 AC 100% 150ms 54976KB
6 AC 100% 227ms 66592KB
7 AC 100% 3791ms 701072KB
8 AC 100% 424ms 139456KB
9 AC 100% 3287ms 774112KB
10 AC 100% 4360ms 774112KB
11 AC 100% 3177ms 774112KB
12 AC 100% 1ms 8336KB
13 AC 100% 3065ms 774112KB
14 AC 100% 1ms 7968KB
15 AC 100% 4245ms 774112KB
16 AC 100% 3230ms 774112KB
17 AC 100% 1ms 8336KB
18 AC 100% 1ms 7680KB

ソースコード

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef vector<int> vi;
const int inf=2*1e9+1;

template <class T>
class RMQ{
	private:
	int n;
	vector<T> rmq;
	T Query_func(int a,int b,int k,int l,int r){
		if(r<=a||b<=l) return inf;
		if(a<=l&&r<=b) return rmq[k];
		int m=(l+r)/2;
		return min(Query_func(a,b,k*2+1,l,m),Query_func(a,b,k*2+2,m,r));
	}
	public:
	void Init(int n_){
		n=1;
		while(n<n_) n*=2;
		rmq=vector<T>(2*n-1,inf);
	}
	void Update(int k,T x){
		k+=n-1;
		rmq[k]=x;
		while(k>0){
			k=(k-1)/2;
			rmq[k]=min(rmq[k*2+1],rmq[k*2+2]);
		}
	}
	T Query(int a,int b){
		return Query_func(a,b,0,0,n);
	}
	T Open(int k){
		return rmq[n+k-1];
	}
};

int n;
vi a,b;

vi s;
vector<RMQ<int> > dpl,dpr;

int f(int l,int r){
	return s[r]-s[l];
}

int main(){
	cin>>n;
	a=b=vi(n);
	s=vi(n+1);
	dpl=dpr=vector<RMQ<int> >(n);
	for(int i=0;i<n;i++){
		cin>>a[i];
		s[i+1]+=s[i]+a[i];
		dpl[i].Init(n+1);
		dpr[i].Init(n+1);
	}
	for(int i=0;i<n;i++) cin>>b[i];
	for(int i=0;i<n;i++){
		dpl[i].Update(i+1,b[i]+(i+1<n?b[i+1]:0));
		if(i) dpr[i].Update(i-1,b[i]+b[i-1]);
	}
	for(int i=1;i<n;i++) for(int j=0;j+i<n;j++){
		int l=j,r=j+i+1,res;
		while(r-l>1){
			int m=(l+r)/2;
			if(f(j,m)<f(m+1,i+j+1)) l=m;
			else r=m;
		}
		res=min(dpl[j].Query(r,i+j+1),dpr[i+j].Query(j,r));
		dpl[j].Update(j+i+1,res+(j+i+1<n?b[j+i+1]:0));
		if(j) dpr[j+i].Update(j-1,res+b[j-1]);
	}
	cout<<dpl[0].Open(n)<<endl;
}