結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 1ms 7776KB
2 AC 100% 2ms 8320KB
3 AC 100% 1ms 7760KB
4 AC 100% 2ms 7696KB
5 AC 100% 216ms 54992KB
6 AC 100% 225ms 66608KB
7 AC 100% 2524ms 701056KB
8 AC 100% 304ms 139472KB
9 AC 100% 3119ms 774128KB
10 AC 100% 3099ms 774128KB
11 AC 100% 3236ms 774128KB
12 AC 100% 2ms 8336KB
13 AC 100% 3015ms 774128KB
14 AC 100% 1ms 8352KB
15 AC 100% 3117ms 774128KB
16 AC 100% 4348ms 774128KB
17 AC 100% 1ms 7776KB
18 AC 100% 1ms 7424KB

ソースコード

#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(){
	scanf("%d",&n);
	a=b=vi(n);
	s=vi(n+1);
	dpl=dpr=vector<RMQ<int> >(n);
	for(int i=0;i<n;i++){
		scanf("%d",&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++) scanf("%d",&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]);
	}
	printf("%d\n",dpl[0].Open(n));
}