제출 #135656

#제출 시각아이디문제언어결과실행 시간메모리
135656E869120Cake 3 (JOI19_cake3)C++14
0 / 100
3 ms504 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#pragma warning (disable: 4996)

class SegmentTree {
public:
	vector<pair<long long, int>> val;

	void add(pair<long long, int>x) {
		val.push_back(x);
		sort(val.begin(), val.end());
	}
	void lose(pair<long long, int>x) {
		vector<pair<long long, int>> val2;
		for (int i = 0; i < val.size(); i++) {
			if (val[i] == x) continue;
			val2.push_back(val[i]);
		}
		val = val2;
	}
	long long getmax(long long M) {
		if (val.size() < M) return -(1LL << 60);
		long long sum = 0;
		for (int i = val.size() - 1; i >= val.size() - M; i--) sum += val[i].first;
		return sum;
	}
};

long long N, M, C[1 << 18], V[1 << 18], ans[1 << 18], id[1 << 18], SIZE_ = 1;
vector<pair<long long, long long>>A;

int main() {
	// --------------------------- 入力・ソート ----------------------
	scanf("%lld%lld", &N, &M);
	for (int i = 0; i < N; i++) {
		scanf("%lld%lld", &V[i], &C[i]);
		A.push_back(make_pair(C[i], V[i]));
	}
	sort(A.begin(), A.end());
	for (int i = 1; i <= N; i++) {
		C[i] = A[i - 1].first; V[i] = A[i - 1].second;
	}

	// ---------------------------- ただの分割 -----------------------
	while (SIZE_ <= N) SIZE_ *= 2;
	ans[SIZE_] = -(1LL << 60); id[SIZE_] = N;
	ans[0] = -(1LL << 60); id[0] = 1;

	for (int i = (SIZE_ >> 1); i >= 1; i >>= 1) {
		vector<int> vec;
		for (int j = i; j < SIZE_; j += i * 2) vec.push_back(j);

		SegmentTree Z;

		int cx = N;
		for (int j = vec.size() - 1; j >= 0; j--) {
			// 新たに追加する
			for (int k = vec[j]; k < min((int)id[vec[j] + i] + 1, cx); k++) {
				if (k <= N) Z.add(make_pair(V[k], k));
			}

			// 答えを求める
			pair<long long, int> maxid = make_pair(-(1LL << 59), N);
			for (int k = id[vec[j] + i]; k >= id[vec[j] - i]; k--) {
				long long v = Z.getmax(M) - 2LL * (C[k] - C[vec[j]]);
				maxid = max(maxid, make_pair(v, k));
				if (k >= vec[j] && k != id[vec[j] - i]) {
					Z.lose(make_pair(V[k], k));
				}
			}
			ans[vec[j]] = maxid.first;
			id[vec[j]] = maxid.second;

			cx = vec[j];
		}
	}

	// --------------------------- 答えを求める ----------------------
	long long FinalAns = -(1LL << 60);
	for (int i = 1; i <= N; i++) FinalAns = max(FinalAns, ans[i]);
	cout << FinalAns << endl;
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

cake3.cpp:5:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable: 4996)
 
cake3.cpp: In member function 'void SegmentTree::lose(std::pair<long long int, int>)':
cake3.cpp:17:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < val.size(); i++) {
                   ~~^~~~~~~~~~~~
cake3.cpp: In member function 'long long int SegmentTree::getmax(long long int)':
cake3.cpp:24:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (val.size() < M) return -(1LL << 60);
       ~~~~~~~~~~~^~~
cake3.cpp:26:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = val.size() - 1; i >= val.size() - M; i--) sum += val[i].first;
                                ~~^~~~~~~~~~~~~~~~~
cake3.cpp: In function 'int main()':
cake3.cpp:36:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld", &N, &M);
  ~~~~~^~~~~~~~~~~~~~~~~~~~
cake3.cpp:38:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld", &V[i], &C[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...