# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
225936 |
2020-04-22T03:56:06 Z |
erd1 |
Park (JOI17_park) |
C++14 |
|
217 ms |
672 KB |
#include "park.h"
#include<bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define pb push_back
using namespace std;
typedef pair<int, int> pii;
template<typename Iter>
ostream& outIt(ostream& out, Iter b, Iter e){
for(Iter i = b; i != e; i++)
out << (i == b?"":" ") << *i;
return out;
}
template<typename T>
ostream& operator<<(ostream& out, vector<T>& v){
return outIt(out << '[', all(v)) << ']';
}
template<typename T1, typename T2>
ostream& operator<<(ostream& out, pair<T1, T2> v){
return out << "(" << v.first << ", " << v.second << ")";
}
static int Place[1400];
int ran(int t = INT_MAX){
static int x = 10292837;
return ((x*0xdefaced+1)&INT_MAX)%t;
}
bool ask(int l, int r){
////cout << l << " " << r << endl;
//for(int i = 0; i < 6; i++)//cout << Place[i] << " "; //cout << endl;
return Ask(min(l, r), max(l, r), Place);
}
void answer(int l, int r){
//cout << l << " a " << r << endl;
Answer(min(l, r), max(l, r));
}
void Sort(int l, int r, vector<int>& v){
////cout << l << " " <<r << " " << v<< endl;
if(v.size() == 0) return answer(l, r);
if(v.size() == 1) return answer(l, v[0]), answer(v[0], r);
int pivot = v[ran(v.size())];
for(auto i: v)Place[i] = 1;
Place[l] = Place[r] = 1;
vector<int> R, L;
for(auto i: v)
if(i != pivot)
Place[i] = 0, (ask(l, pivot)?R:L).pb(i), Place[i] = 1;
for(auto i: v)Place[i] = 0;
Place[l] = Place[r] = 0;
Sort(l, pivot, L); Sort(pivot, r, R);
auto st = copy(all(L), v.begin());
*st = pivot;
copy(all(R), next(st));
}
int FindLink(int N, int x, vector<int> v){
int l = 0, r = v.size();
////cout << "FindLink" << v << endl;
for(int i = 0; i < N; i++)Place[i] = 1;
while(r-l > 1){
for(int i = (l+r>>1); i < v.size();i++)Place[v[i]] = 0;
(ask(v[0], x)?r:l) = l+r>>1;
for(int i = 0; i < v.size();i++)Place[v[i]] = 1;
}
for(int i = 0; i < N; i++)Place[i] = 0;
return v[l];
}
vector<int> Findchain(int x, int y, vector<int>& pool){
////cout << "Findchain" << endl;
Place[x] = Place[y] = 1;
vector<int> ans;
if(ask(x, y))return Place[x] = Place[y], ans;
int l = -1, r = pool.size();
while(true){
while(r-l > 1){
for(auto i: pool)Place[i] = false;
for(int i = 0; i < (l+r>>1); i++)Place[pool[i]] = 1;
(ask(x, y)?r:l) = (l+r>>1);
}
if(r == 0)break;
ans.pb(pool[r-1]); Place[pool[r-1]] = 1;
pool.erase(pool.begin()+r-1);
l = -1;
}
for(auto i: pool)Place[i] = false;
for(auto i: ans)Place[i] = false;
Place[x] = Place[y] = 0;
reverse(all(ans));
return ans;
}
vector<vector<pii>> G;
void CheckEdge(int x, int p, vector<int>& pool){
//cout << x << " " << p << pool << endl;
for(auto [j, pos]: G[p]){
for(auto i: pool)Place[i] = true; Place[p] = false; Place[x] = true;
if(!ask(x, j))continue;
//cout << "start finding!" << endl << j << " " << pos << endl;
int l = pos, r = pool.size();
for(auto i: pool)Place[i] = false; Place[x] = Place[j] = true;
if(ask(x, j))answer(x, j);
while(true){
while(r-l > 1){
for(auto i: pool)Place[i] = false;
for(int i = 0; i < (l+r>>1); i++)Place[pool[i]] = true; Place[p] = false;
(ask(x, j)?r:l) = (l+r>>1);
}
if(l == pos)break; r--;
//cout << "found edge" << pool[l] << " " << x << endl;
answer(pool[l], x);
l = pos;
}
}
for(auto i: pool)Place[i] = false; Place[x] = 0;
}
vector<int> v, ord, pool;
vector<bool> used;
void Detect(int T, int N) {
v.resize(N-1); G.resize(N);
iota(all(v), 1);
pool.resize(N-1); iota(all(pool), 1);
used.resize(N);
ord.pb(0);
random_shuffle(all(v), ran);
////cout << v << endl;
for(auto i: v){
if(used[i])continue;
int x = FindLink(N, i, ord); // maybe i -> (>x)
pool.erase(find(all(pool), i));
auto vs = Findchain(x, i, pool);
////cout << x << " " << i << vs << endl;
for(auto j: vs)used[j] = true;
Sort(x, i, vs);
vs.pb(i);
//cout << vs << endl;
for(auto j: vs)CheckEdge(j, x, ord);
for(int j = 0, last = x; j < vs.size(); j++)G[last].pb({vs[j], ord.size()+j}), last = vs[j];
//cout << G << endl;
copy(all(vs), inserter(ord, ord.end()));
////cout << ord << endl;
vs.resize(0);
}
}
Compilation message
park.cpp: In function 'int FindLink(int, int, std::vector<int>)':
park.cpp:67:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
for(int i = (l+r>>1); i < v.size();i++)Place[v[i]] = 0;
~^~
park.cpp:67:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = (l+r>>1); i < v.size();i++)Place[v[i]] = 0;
~~^~~~~~~~~~
park.cpp:68:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
(ask(v[0], x)?r:l) = l+r>>1;
~^~
park.cpp:69:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < v.size();i++)Place[v[i]] = 1;
~~^~~~~~~~~~
park.cpp: In function 'std::vector<int> Findchain(int, int, std::vector<int>&)':
park.cpp:83:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
for(int i = 0; i < (l+r>>1); i++)Place[pool[i]] = 1;
~^~
park.cpp:84:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
(ask(x, y)?r:l) = (l+r>>1);
~^~
park.cpp: In function 'void CheckEdge(int, int, std::vector<int>&)':
park.cpp:101:14: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
for(auto [j, pos]: G[p]){
^
park.cpp:102:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for(auto i: pool)Place[i] = true; Place[p] = false; Place[x] = true;
^~~
park.cpp:102:43: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
for(auto i: pool)Place[i] = true; Place[p] = false; Place[x] = true;
^~~~~
park.cpp:106:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for(auto i: pool)Place[i] = false; Place[x] = Place[j] = true;
^~~
park.cpp:106:44: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
for(auto i: pool)Place[i] = false; Place[x] = Place[j] = true;
^~~~~
park.cpp:111:38: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
for(int i = 0; i < (l+r>>1); i++)Place[pool[i]] = true; Place[p] = false;
~^~
park.cpp:111:17: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for(int i = 0; i < (l+r>>1); i++)Place[pool[i]] = true; Place[p] = false;
^~~
park.cpp:111:73: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
for(int i = 0; i < (l+r>>1); i++)Place[pool[i]] = true; Place[p] = false;
^~~~~
park.cpp:112:37: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
(ask(x, j)?r:l) = (l+r>>1);
~^~
park.cpp:114:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
if(l == pos)break; r--;
^~
park.cpp:114:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
if(l == pos)break; r--;
^
park.cpp:120:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for(auto i: pool)Place[i] = false; Place[x] = 0;
^~~
park.cpp:120:40: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
for(auto i: pool)Place[i] = false; Place[x] = 0;
^~~~~
park.cpp: In function 'void Detect(int, int)':
park.cpp:143:36: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j = 0, last = x; j < vs.size(); j++)G[last].pb({vs[j], ord.size()+j}), last = vs[j];
~~^~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
384 KB |
Wrong Answer[2] |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
168 ms |
512 KB |
Output is correct |
2 |
Correct |
161 ms |
632 KB |
Output is correct |
3 |
Correct |
189 ms |
512 KB |
Output is correct |
4 |
Correct |
161 ms |
672 KB |
Output is correct |
5 |
Correct |
128 ms |
592 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
188 ms |
512 KB |
Output is correct |
2 |
Correct |
209 ms |
532 KB |
Output is correct |
3 |
Correct |
209 ms |
516 KB |
Output is correct |
4 |
Correct |
212 ms |
512 KB |
Output is correct |
5 |
Correct |
202 ms |
524 KB |
Output is correct |
6 |
Correct |
217 ms |
632 KB |
Output is correct |
7 |
Correct |
216 ms |
512 KB |
Output is correct |
8 |
Correct |
207 ms |
504 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
100 ms |
504 KB |
Output is correct |
2 |
Correct |
186 ms |
504 KB |
Output is correct |
3 |
Correct |
185 ms |
512 KB |
Output is correct |
4 |
Correct |
156 ms |
504 KB |
Output is correct |
5 |
Correct |
186 ms |
512 KB |
Output is correct |
6 |
Correct |
169 ms |
512 KB |
Output is correct |
7 |
Correct |
152 ms |
532 KB |
Output is correct |
8 |
Correct |
183 ms |
512 KB |
Output is correct |
9 |
Correct |
173 ms |
512 KB |
Output is correct |
10 |
Correct |
182 ms |
512 KB |
Output is correct |
11 |
Correct |
210 ms |
512 KB |
Output is correct |
12 |
Correct |
199 ms |
508 KB |
Output is correct |
13 |
Correct |
129 ms |
512 KB |
Output is correct |
14 |
Correct |
206 ms |
512 KB |
Output is correct |
15 |
Correct |
124 ms |
632 KB |
Output is correct |
16 |
Correct |
206 ms |
504 KB |
Output is correct |
17 |
Correct |
157 ms |
512 KB |
Output is correct |
18 |
Correct |
201 ms |
512 KB |
Output is correct |
19 |
Correct |
140 ms |
512 KB |
Output is correct |
20 |
Correct |
172 ms |
504 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
15 ms |
512 KB |
Wrong Answer[2] |
2 |
Halted |
0 ms |
0 KB |
- |