Submission #285131

#TimeUsernameProblemLanguageResultExecution timeMemory
285131user202729Aliens (IOI16_aliens)C++17
25 / 100
2067 ms7040 KiB
// moreflags=grader.cpp
// naive solution.
#include "aliens.h"
// 15
#include<algorithm>
#include<cstdint>
#include<climits>
#if not LOCAL
#define NDEBUG
#endif
#include<cassert>

long long take_photos(int n, int m, int numPhoto, std::vector<int> r, std::vector<int> c) {
	std::vector<std::pair<int, int>> points(r.size());
	for(int index=0; index<(int)r.size(); ++index)
		points[index]=std::minmax({r[index], c[index]});
	std::sort(begin(points), end(points),
			[&](auto first, auto sec){return first.first!=sec.first ? first.first<sec.first: first.second>sec.second;
			});
	{ // keep only extreme points
		auto out=points.begin()+1;
		std::for_each(out, points.end(),[&](auto it){
			assert(it.first>=out[-1].first);
			if(it.second>out[-1].second){
				assert(it.first>out[-1].first);
				*out++=it;
			}
		});
		points.erase(out, points.end());
	}
	r.clear(); c.clear(); n=-1;

	auto const square=[&](int it)->int64_t{return (int64_t)it*it;};
	std::vector<std::vector<int64_t>> value(points.size()+1, std::vector<int64_t>(numPhoto+1));
	for(int pos=1; pos<=(int)points.size(); ++pos){
		value[pos][0]=INT64_MAX/2;
		for(int numPhoto=1; numPhoto<(int)value[pos].size(); ++numPhoto){
			auto& cur=value[pos][numPhoto]=INT64_MAX/2;
			for(int last=0; last<pos; ++last){
				cur=std::min(cur, value[last][numPhoto-1]
						+square(points[pos-1].second-points[last].first+1)
						-square(last==0 ? 0: std::max(0, points[last-1].second-points[last].first+1))
						);
			}
		}
	}

	return value[points.size()][numPhoto];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...