Submission #478039

#TimeUsernameProblemLanguageResultExecution timeMemory
478039aryan12Pilot (NOI19_pilot)C++17
100 / 100
875 ms85476 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 par[N], siz[N];

bool cmp(array<int, 3> a, array<int, 3> b) {
	if(a[0] == b[0]) {
		return a[1] < b[1];
	}
	return a[0] < b[0];
}

int Find(int x) {
	if(x == par[x]) {
		return x;
	}
	return par[x] = Find(par[x]);
}

void Unite(int a, int b) {
	a = Find(a), b = Find(b);
	par[a] = b;
	siz[b] += siz[a];
}

void Solve() {
	for(int i = 0; i < N; i++) {
		par[i] = i;
		siz[i] = 1;
	}
	int n, q;
	cin >> n >> q;
	vector<int> input(n + 1);
	vector<array<int, 3> > values;
	for(int i = 1; i <= n; i++) {
		cin >> input[i];
		values.push_back({input[i], 0, i});
	}
	vector<int> query_ans(q + 1);
	for(int i = 1; i <= q; i++) {
		int cur_val;
		cin >> cur_val;
		values.push_back({cur_val, 1, i});
	}
	sort(values.begin(), values.end(), cmp);
	int cur_ans = 0;
	for(int i = 0; i < values.size(); i++) {
		int val = values[i][0], in_or_query = values[i][1], idx = values[i][2];
		if(in_or_query == 0) {
			int before = Find(idx);
			before = siz[before];
			int before1 = Find(idx + 1);
			before1 = siz[before1];
			cur_ans -= (before * (before + 1)) / 2;
			cur_ans -= (before1 * (before1 + 1)) / 2;
			Unite(idx, idx + 1);
			int after = Find(idx);
			after = siz[after];
			cur_ans += (after * (after + 1)) / 2;
		}
		else {
			query_ans[idx] = cur_ans;
		}
	}
	for(int i = 1; i <= q; i++) {
		cout << query_ans[i] << "\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;
}

Compilation message (stderr)

pilot.cpp: In function 'void Solve()':
pilot.cpp:51:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |  for(int i = 0; i < values.size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~
pilot.cpp:52:7: warning: unused variable 'val' [-Wunused-variable]
   52 |   int val = values[i][0], in_or_query = values[i][1], idx = values[i][2];
      |       ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...