tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

SRM 518 Div1

2完してもレーティング下がるらしい。
記事書く気もしません。元凶は不明らしいですが、Testerと信じて疑わないことにします。

追記

余談ですが、Testerがどうのこうの以前に自分の思考回路から生まれるソースコードがあれです。

#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
class ConvexSequence{
	public:
	long long getMinimum(vector<int>a){
		long long ret=1LL<<62;
		int i=0;
		for(int j=0;j<a.size();j++)if(a[i]>a[j])i=j;
		
			long long val=0;
			vector<int > b(a.size());
			for(int j=0;j<a.size();j++)b[j]=a[j];
			for(int j=i-1;j>0;j--){
				if(j<a.size()-1&&b[j]*2>b[j-1]+b[j+1]){
					val+=b[j]-(b[j-1]+b[j+1])/2;
					b[j]=(b[j-1]+b[j+1])/2;
					bool ok=true;
					do{
					ok=true;
					for(int k=j;k<=i;k++){
					if(k&&k<a.size()-1){
					
						val+=max(0,b[k]-(b[k-1]+b[k+1])/2);
						if(b[k]*2>b[k-1]+b[k+1]){
							ok=false;b[k]=(b[k-1]+b[k+1])/2;
					}}}
					}while(!ok);
				}
			}
			printf("%d %lld\n",i,val);
			for(int j=i+1;j<a.size()-1;j++){
				if(j&&b[j]*2>b[j-1]+b[j+1]){
					val+=b[j]-(b[j-1]+b[j+1])/2;
					b[j]=(b[j-1]+b[j+1])/2;
					bool ok=true;
				do{
				ok=true;
					for(int k=j;k>=i;k--){
					
					if(k&&k<a.size()-1){
					
						val+=max(0,b[k]-(b[k-1]+b[k+1])/2);
						if(b[k]*2>b[k-1]+b[k+1]){ok=false;b[k]=(b[k-1]+b[k+1])/2;}
					}}
				}while(!ok);
				}
			}
		//	if(i||i<a.size()-1)val+=max(0,b[i]-(b[i-1]+b[i+1])/2);
			ret=min(ret,val);
			printf("%d %lld\n",i,val);
		
		return ret;
	}
};

C++とか難しいのでMath.maxとか書いていた