# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
165641 |
2019-11-28T03:44:18 Z |
_qVp_ |
Zamjene (COCI16_zamjene) |
C++14 |
|
6000 ms |
192652 KB |
#include <bits/stdc++.h>
using namespace std;
const int base = 1234577;
const int md = 1e6 + 10;
int n, T;
int p[md], q[md], sz[md], lab[md];
long long pw[md], id[md], val[md];
long long pairs;
map < long long, int > diff_nodes;
void addNode(int sign, long long diff, int num) {
if (diff != 0)
pairs += sign * num * diff_nodes[-diff];
diff_nodes[diff] += sign * num;
}
int root(int x) {
if (lab[x] < 0)
return x;
return lab[x] = root(lab[x]);
}
void init() {
cin >> n >> T;
pw[0] = 1;
for(int i = 1; i < md; i++)
pw[i] = pw[i - 1] * base;
for(int i = 1; i <= n; i++) {
cin >> p[i];
q[i] = p[i];
lab[i] = -1;
sz[i] = 1;
}
sort(q + 1, q + 1 + n);
for(int i = 1; i <= n; i++) {
id[i] = pw[q[i]];
val[i] = pw[p[i]];
//cout << id[i] << " " << val[i] << endl;
addNode(1, id[i] - val[i], sz[i]);
}
}
void add(int sign, int ru, int u, int v) {
id[ru] += sign * pw[u];
val[ru] += sign * pw[v];
sz[ru] += sign;
}
void merges(int u, int v) {
int ru = root(u), rv = root(v);
if (ru == rv)
return ;
if (lab[ru] > lab[rv])
swap(ru, rv);
addNode(-1, id[ru] - val[ru], sz[ru]);
addNode(-1, id[rv] - val[rv], sz[rv]);
lab[ru] += lab[rv];
lab[rv] = ru;
sz[ru] += sz[rv];
id[ru] += id[rv];
val[ru] += val[rv];
//cout << id[ru] << " " << val[ru] << endl;
addNode(1, id[ru] - val[ru], sz[ru]);
}
int main() {
//freopen("test.in", "r", stdin);
ios_base::sync_with_stdio(0); cin.tie(0);
init();
while (T--) {
int type;
cin >> type;
if (type == 1) {
int u, v;
cin >> u >> v;
int ru = root(u), rv = root(v);
if (ru == rv) {
swap(p[u], p[v]);
continue;
}
addNode(-1, id[ru] - val[ru], sz[ru]);
addNode(-1, id[rv] - val[rv], sz[rv]);
add(-1, ru, u, p[u]);
add(-1, rv, v, p[v]);
swap(p[u], p[v]);
add(1, ru, u, p[u]);
add(1, rv, v, p[v]);
addNode(1, id[ru] - val[ru], sz[ru]);
addNode(1, id[rv] - val[rv], sz[rv]);
} else if (type == 2) {
int u, v;
cin >> u >> v;
merges(u, v);
} else if (type == 3) {
//cout << diff_nodes[0] << endl;
if (diff_nodes[0] == n)
cout << "DA\n";
else cout << "NE\n";
} else {
cout << pairs << '\n';
}
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
8184 KB |
Output is correct |
2 |
Correct |
9 ms |
8184 KB |
Output is correct |
3 |
Correct |
9 ms |
8184 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
10 ms |
8228 KB |
Output is correct |
2 |
Correct |
9 ms |
8184 KB |
Output is correct |
3 |
Correct |
10 ms |
8312 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
8312 KB |
Output is correct |
2 |
Correct |
10 ms |
8340 KB |
Output is correct |
3 |
Correct |
10 ms |
8312 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
8184 KB |
Output is correct |
2 |
Correct |
10 ms |
8196 KB |
Output is correct |
3 |
Correct |
10 ms |
8312 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
8312 KB |
Output is correct |
2 |
Correct |
10 ms |
8312 KB |
Output is correct |
3 |
Correct |
10 ms |
8312 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
15 ms |
8824 KB |
Output is correct |
2 |
Correct |
49 ms |
8700 KB |
Output is correct |
3 |
Correct |
16 ms |
8952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
70 ms |
13020 KB |
Output is correct |
2 |
Correct |
142 ms |
14588 KB |
Output is correct |
3 |
Correct |
200 ms |
17824 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1379 ms |
49900 KB |
Output is correct |
2 |
Correct |
5398 ms |
141432 KB |
Output is correct |
3 |
Execution timed out |
6072 ms |
192652 KB |
Time limit exceeded |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2686 ms |
92816 KB |
Output is correct |
2 |
Correct |
4750 ms |
114808 KB |
Output is correct |
3 |
Correct |
1914 ms |
103580 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1106 ms |
58012 KB |
Output is correct |
2 |
Correct |
2992 ms |
97920 KB |
Output is correct |
3 |
Correct |
1931 ms |
103608 KB |
Output is correct |