제출 #443152

#제출 시각아이디문제언어결과실행 시간메모리
443152aryan12Vudu (COCI15_vudu)C++17
140 / 140
501 ms39556 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());

const int N = 1e6 + 5;
int n, avg;
vector<int> a;
int BIT[N];

bool cmp(pair<int, int> a, pair<int, int> b) {
	return ((avg * a.second - a.first) > (avg * b.second - b.first));
}

void Update(int pos, int val) {
	for(int i = pos; i < N; i += (i & (-i))) {
		BIT[i] += val;
	}
}

int Query(int pos) {
	int ans = 0;
	for(int i = pos; i > 0; i -= (i & (-i))) {
		ans += BIT[i];
	}
	return ans;
}

void Solve() {
	cin >> n;
	a.resize(n + 1);
	for(int i = 0; i < N; i++) {
		BIT[i] = 0;
	}
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	cin >> avg;
	vector<pair<int, int> > min_suf;
	min_suf.push_back(make_pair(-1, -1));
	int sum = 0;
	for(int i = n; i > 0; i--) {
		sum += a[i];
		min_suf.push_back(make_pair(sum, n - i + 1));
	}
	min_suf.push_back(make_pair(0, 0));
	int total = n * avg - sum;
	sort(min_suf.begin() + 1, min_suf.end(), cmp);
	sum = 0;
	//cout << "total = " << total << "\n";
	int res = 0;

	int pos[n + 1];
	for(int i = 1; i < min_suf.size(); i++) {
		if(min_suf[i].second != 0) {
			pos[n + 1 - min_suf[i].second] = i;
		}
	} 

	for(int i = 1; i <= n; i++) {
		Update(pos[i], 1);
		int l = 1, r = min_suf.size() - 1;
		int mid, ans = 0;
		while(l <= r) {
			mid = (l + r) >> 1;
			auto [s, len] = min_suf[mid];
			int val = avg * len - s; //+ve - bad val gone
			int prevval = (i - 1) * avg - sum;
			if(prevval + val >= total) {
				l = mid + 1;
				ans = mid;
			}
			else {
				r = mid - 1;
			}
		}
		//cout << "Index = " << i << "\n";
		//cout << "answer = " << ans << "\n";
		//cout << "Query(answer) = " << Query(ans) << "\n";
		//cout << "Thus, final answer = " << ans - Query(ans) << "\n";
		res += ans;
		res -= Query(ans);
		sum += a[i];
	}
	cout << res << "\n";
}

int32_t main() {
	auto begin = std::chrono::high_resolution_clock::now();
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t = 1;
	//cin >> t;
	while(t--) {
		Solve();
	}
	auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n"; 
	return 0;
}

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

vudu.cpp: In function 'void Solve()':
vudu.cpp:55:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |  for(int i = 1; i < min_suf.size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...