#include "longesttrip.h"
#include<bits/stdc++.h>
using namespace std;
set<int> un_process;
vector<int> B_complex_graph(vector<int> A,vector<int> B){
// B is a complex_graph set
vector<int> tmp={0},tmp1={0};
tmp[0] = A[0];
if(!are_connected(tmp,B)){
// now A[0],A.back() connected
// only need to find one edge between A and B or return no such edge
int L = 0;int R = (int) B.size()-1;int M = (L+R)/2;
while(L!=R){
vector<int> query;
M = (L+R)/2;
for(int i=L;i<=M;i++){
query.push_back(B[i]);
}
if(!are_connected(A,query)) L = M+1;
else R = M;
}
int l = 0;int r = (int) A.size()-1;int m = (L+R)/2;
while(l!=r){
vector<int> query;
m = (l+r)/2;
for(int i=l;i<=m;i++){
query.push_back(A[i]);
}
tmp[0]=B[L];
if(!are_connected(query,tmp)) l = m+1;
else r = m;
}
tmp1[0]=l;
if(are_connected(tmp1,tmp)){
vector<int> answer;
for(int i=0;i<(int)A.size();i++) answer.push_back(A[(i+l+1)%((int)A.size())]);
answer.push_back(B[L]);
for(int i=0;i<(int)B.size()-1;i++) answer.push_back(B[(i+L+1)%((int)B.size())]);
return answer;
}
else{
return A;
}
}
else{
int L = 0;int R = (int) B.size()-1;int M = (L+R)/2;
while(L!=R){
vector<int> query;
M = (L+R)/2;
for(int i=L;i<=M;i++){
query.push_back(B[i]);
}
if(!are_connected(tmp,query)) L = M+1;
else R = M;
}
vector<int> answer;
for(int i=(int)A.size()-1;i>=0;i--) answer.push_back(A[i]);
answer.push_back(B[R]);
//cout << "B_size" << (int)B.size() << "\n";
for(int i=0;i<(int)B.size()-1;i++) answer.push_back(B[(i+R+1)%((int)B.size())]);
return answer;
}
}
vector<int> Process(vector<int> C,vector<int> D){
if((int)D.size()==0) {return C;}
vector<int> A,B;
if((int)C.size()<(int)D.size()){A=D;B=C;}
else{A=C;B=D;}
vector<int> tmp = {1};
tmp[0] = A.back();
if(!are_connected(tmp,B)){
return B_complex_graph(A,B);
}
else{
int L = 0;int R = (int) B.size()-1;int M = (L+R)/2;
while(L!=R){
vector<int> query;
M = (L+R)/2;
cout << M << " \n";
for(int i=L;i<=M;i++){
query.push_back(B[i]);
}
if(!are_connected(tmp,query)) L = M+1;
else R = M;
}
vector<int> new_B;
if(L > (int)B.size()/2){
for(int i=L;i>=0;i--){
A.push_back(B[i]);
}
for(int i=L+1;i<(int)B.size();i++){
new_B.push_back(B[i]);
}
}
else{
for(int i=L;i<(int)B.size();i++){
A.push_back(B[i]);
}
for(int i=L-1;i>=0;i--){
new_B.push_back(B[i]);
}
}
return Process(A,new_B);
}
}
vector<int> longest_trip(int N, int D)
{
for(int i=2;i<N;i++){
un_process.insert(i);
}
vector<int> a={0};
vector<int> b={1};
while((int)un_process.size()>=1){
vector<int> ask1 = {a.back()};
vector<int> ask2 = {b.back(),*un_process.begin()};
if(are_connected(ask1,ask2)){
vector<int> ask3 = {a.back()};
vector<int> ask4 = {*un_process.begin()};
if(are_connected(ask3,ask4)) a.push_back(*un_process.begin());
else{
for(int i = (int)b.size()-1;i>=0;i--) a.push_back(b[i]);
b.clear();
b.push_back(*un_process.begin());
}
}
else{
b.push_back(*un_process.begin());
}
un_process.erase(un_process.begin());
}
return Process(a,b);
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
2 ms |
340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
344 KB |
Output is correct |
2 |
Correct |
10 ms |
344 KB |
Output is correct |
3 |
Correct |
9 ms |
344 KB |
Output is correct |
4 |
Correct |
10 ms |
344 KB |
Output is correct |
5 |
Correct |
10 ms |
600 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
344 KB |
Output is correct |
2 |
Correct |
9 ms |
344 KB |
Output is correct |
3 |
Correct |
9 ms |
344 KB |
Output is correct |
4 |
Correct |
9 ms |
344 KB |
Output is correct |
5 |
Correct |
9 ms |
600 KB |
Output is correct |
6 |
Correct |
9 ms |
344 KB |
Output is correct |
7 |
Correct |
9 ms |
344 KB |
Output is correct |
8 |
Correct |
9 ms |
344 KB |
Output is correct |
9 |
Correct |
8 ms |
344 KB |
Output is correct |
10 |
Correct |
10 ms |
600 KB |
Output is correct |
11 |
Correct |
10 ms |
448 KB |
Output is correct |
12 |
Correct |
10 ms |
600 KB |
Output is correct |
13 |
Correct |
10 ms |
448 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
344 KB |
Output is correct |
2 |
Correct |
12 ms |
344 KB |
Output is correct |
3 |
Correct |
10 ms |
416 KB |
Output is correct |
4 |
Correct |
9 ms |
344 KB |
Output is correct |
5 |
Correct |
9 ms |
448 KB |
Output is correct |
6 |
Correct |
7 ms |
344 KB |
Output is correct |
7 |
Correct |
10 ms |
344 KB |
Output is correct |
8 |
Correct |
9 ms |
344 KB |
Output is correct |
9 |
Correct |
8 ms |
340 KB |
Output is correct |
10 |
Correct |
9 ms |
600 KB |
Output is correct |
11 |
Correct |
9 ms |
448 KB |
Output is correct |
12 |
Correct |
9 ms |
444 KB |
Output is correct |
13 |
Correct |
10 ms |
448 KB |
Output is correct |
14 |
Incorrect |
1 ms |
344 KB |
non-disjoint arrays |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
344 KB |
Output is correct |
2 |
Correct |
10 ms |
344 KB |
Output is correct |
3 |
Correct |
11 ms |
340 KB |
Output is correct |
4 |
Correct |
11 ms |
344 KB |
Output is correct |
5 |
Partially correct |
12 ms |
600 KB |
Output is partially correct |
6 |
Correct |
8 ms |
344 KB |
Output is correct |
7 |
Correct |
9 ms |
344 KB |
Output is correct |
8 |
Correct |
8 ms |
344 KB |
Output is correct |
9 |
Correct |
8 ms |
596 KB |
Output is correct |
10 |
Partially correct |
9 ms |
600 KB |
Output is partially correct |
11 |
Partially correct |
10 ms |
444 KB |
Output is partially correct |
12 |
Partially correct |
9 ms |
448 KB |
Output is partially correct |
13 |
Partially correct |
9 ms |
600 KB |
Output is partially correct |
14 |
Incorrect |
0 ms |
344 KB |
non-disjoint arrays |
15 |
Halted |
0 ms |
0 KB |
- |