이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
}
컴파일 시 표준 에러 (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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |