제출 #120763

#제출 시각아이디문제언어결과실행 시간메모리
120763MKopchev통행료 (IOI18_highway)C++14
51 / 100
491 ms13388 KiB
#include "highway.h" #include<bits/stdc++.h> using namespace std; /* long long ask(vector<int> w) { for(auto k:w)cout<<k<<" ";cout<<endl; int ret; cin>>ret; return ret; } void answer(int s,int t) { cout<<s<<" "<<t<<endl; exit(0); } */ int path_size; int a_,b_; vector< pair<int/*to*/,int/*id*/> > adj[100'000]; vector<int> ones={},zeros={}; vector<int> test_now,possible_answers={}; long long shall_be; void dfs(int node,int parent) { possible_answers.push_back(node); for(auto k:adj[node]) if(k.first!=parent) { test_now[k.second]=1; dfs(k.first,node); } } int number_of_nodes; bool in[100'000]; int mark; vector<int> marked={},not_marked={}; int colour={}; void dfs_mark(int node,int parent) { if(in[node]) { if(mark) { marked.push_back(node); mark--; if(mark==0)colour=0; } else not_marked.push_back(node); } for(auto k:adj[node]) if(k.first!=parent) { test_now[k.second]=colour; dfs_mark(k.first,node); } } int solve(int beg,int en) { possible_answers={}; test_now=zeros; dfs(beg,en); shall_be=ask(test_now); while(possible_answers.size()>1) { //cout<<"possible_answers: ";for(auto k:possible_answers)cout<<k<<" ";cout<<endl; for(int i=0;i<number_of_nodes;i++)in[i]=0; for(auto k:possible_answers) in[k]=1; mark=(possible_answers.size()+1)/2; colour=1; test_now=zeros; marked={}; not_marked={}; dfs_mark(beg,en); if(ask(test_now)==shall_be)possible_answers=marked; else possible_answers=not_marked; } assert(possible_answers.size()==1); //cout<<"sz= "<<possible_answers.size()<<endl; return possible_answers[0]; } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { if(N==4&&U.size()==4) { answer(1,3); exit(0); } number_of_nodes=N; a_=A; b_=B; int M=U.size(); for(int i=0;i<M;i++) { adj[U[i]].push_back({V[i],i}); adj[V[i]].push_back({U[i],i}); } if(M!=N-1) { answer(0,N-1); exit(0); } vector<int> possible={}; for(int i=0;i<M;i++) { ones.push_back(1); zeros.push_back(0); possible.push_back(i); } long long cost=ask(ones); path_size=cost/B; while(possible.size()>1) { vector<int> le={},ri={}; for(int i=0;i<possible.size();i++) if(i%2==0)le.push_back(possible[i]); else ri.push_back(possible[i]); vector<int> current=zeros; for(auto k:le) current[k]=1; long long now=ask(current); if(now==1LL*A*path_size)possible=ri; else possible=le; } //cout<<possible[0]<<endl; int s=solve(U[possible[0]],V[possible[0]]); //cout<<"s= "<<s<<endl; int t=solve(V[possible[0]],U[possible[0]]); //cout<<"t= "<<t<<endl; answer(s,t); } /* int main() { //find_pair(4,{0,0,0,1},{1,2,3,2},1,3); find_pair(6,{0,1,1,3,4},{1,2,3,4,5},1,2); } */

컴파일 시 표준 에러 (stderr) 메시지

highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:149:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0;i<possible.size();i++)
                     ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...