# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
605015 |
2022-07-25T12:17:04 Z |
SlavicG |
ICC (CEOI16_icc) |
C++17 |
|
162 ms |
616 KB |
#include "icc.h"
#include <bits/stdc++.h>
using namespace std;
/*
int query(int a, int b, int* aa, int* bb) {
}
*/
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int query(vector<int> a, vector<int> b) {
int aa[(int)a.size()], bb[(int)b.size()];
for(int i = 0; i < (int)a.size(); ++i) aa[i] = a[i];
for(int i = 0; i < (int)b.size(); ++i) bb[i] = b[i];
return query(a.size(), b.size(), aa, bb);
}
struct dsu {
vector<int> p;
dsu(int n) {
p.resize(n);
iota(p.begin(), p.end(), 0);
}
int get(int a) {return p[a] = (p[a] == a ? a : get(p[a]));}
void uni(int a, int b) {
a = get(a);
b = get(b);
if(rng() & 1) swap(a, b);
p[a] = b;
}
};
void run(int n) {
dsu d(n + 5);
for(int times = 0; times < n - 1; ++times) {
int st = -1;
vector<int> v;
for(int i = 1; i <= n; ++i) v.push_back(d.get(i));
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
vector<int> A, B;
vector<int> bits;
for(int bit = 0; (1 << bit) < n; ++bit) bits.push_back(bit);
shuffle(bits.begin(), bits.end(), rng);
int mn = INT_MAX;
for(int bit: bits) {
vector<int> c1, c2;
for(int i = 1; i <= n; ++i) {
if((d.get(i) - 1) & (1 << bit)) c1.push_back(i);
else c2.push_back(i);
}
if(c1.empty() || c2.empty()) continue;
if(query(c1, c2)) {
if(ceil(log2(c1.size())) + ceil(log2(c2.size())) < mn) {
mn = ceil(log2(c1.size())) + ceil(log2(c2.size()));
A = c1, B = c2;
}
}
}
assert(A.size() > 0 && B.size() > 0);
shuffle(A.begin(), A.end(), rng);
shuffle(B.begin(), B.end(), rng);
int ansA = -1, ansB = -1;
int l = 0, r = (int)A.size() - 1;
while(l <= r) {
int mid = l + r >> 1;
vector<int> paiu;
for(int i = 0; i <= mid; ++i) paiu.push_back(A[i]);
if(query(paiu, B)) {
ansA = A[mid];
r = mid - 1;
} else l = mid + 1;
}
l = 0, r = (int)B.size() - 1;
while(l <= r) {
int mid = l + r >> 1;
vector<int> paiu;
for(int i = 0; i <= mid; ++i) paiu.push_back(B[i]);
if(query(paiu, A)) {
ansB = B[mid];
r = mid - 1;
} else l = mid + 1;
}
assert(ansA != -1 && ansB != -1);
d.uni(ansA, ansB);
setRoad(ansA, ansB);
}
}
/*
int main() {
int n; cin >> n;
run(n);
}
*/
Compilation message
icc.cpp: In function 'void run(int)':
icc.cpp:67:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
67 | int mid = l + r >> 1;
| ~~^~~
icc.cpp:77:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
77 | int mid = l + r >> 1;
| ~~^~~
icc.cpp:37:13: warning: unused variable 'st' [-Wunused-variable]
37 | int st = -1;
| ^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
468 KB |
Ok! 135 queries used. |
2 |
Correct |
9 ms |
500 KB |
Ok! 128 queries used. |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
47 ms |
480 KB |
Ok! 730 queries used. |
2 |
Correct |
43 ms |
468 KB |
Ok! 751 queries used. |
3 |
Correct |
44 ms |
480 KB |
Ok! 741 queries used. |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
141 ms |
596 KB |
Ok! 1777 queries used. |
2 |
Correct |
153 ms |
504 KB |
Ok! 1837 queries used. |
3 |
Correct |
144 ms |
616 KB |
Ok! 1778 queries used. |
4 |
Correct |
145 ms |
496 KB |
Ok! 1758 queries used. |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
135 ms |
504 KB |
Ok! 1763 queries used. |
2 |
Correct |
140 ms |
468 KB |
Ok! 1767 queries used. |
3 |
Correct |
145 ms |
588 KB |
Ok! 1803 queries used. |
4 |
Correct |
133 ms |
496 KB |
Ok! 1773 queries used. |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
144 ms |
508 KB |
Too many queries! 1780 out of 1775 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
162 ms |
504 KB |
Too many queries! 1780 out of 1625 |
2 |
Halted |
0 ms |
0 KB |
- |