제출 #521436

#제출 시각아이디문제언어결과실행 시간메모리
521436azberjibiouPark (JOI17_park)C++17
0 / 100
211 ms896 KiB
#include "park.h" #include <bits/stdc++.h> using namespace std; int N; static int Place[1400]; bool Chk[1400]; int now; vector <int> new_check; vector <int> to_check; vector <int> v[1400]; void solv(int s, int e) { for(int i=s;i<=e;i++) Place[to_check[i]]=0; int val=Ask(0, now, Place); if(val==1) return; for(int i=s;i<=e;i++) Place[to_check[i]]=1; if(s==e) { new_check.push_back(to_check[s]); return; } int mid=(s+e)/2; solv(s, mid); solv(mid+1, e); } bool cmp1(int a, int b) { Place[a]=0; int val=Ask(0, b, Place); Place[a]=1; return val==0; } vector <int> tree[1400]; vector <int> euler; void dfs(int now, int pre) { euler.push_back(now); for(int nxt : tree[now]) if(nxt!=pre) { dfs(nxt, now); euler.push_back(now); } } int cnt; int solv_par(int now, int pre) { euler.clear(); dfs(0, -1); for(int i=0;i<N;i++) Place[i]=0; Place[now]=1; set <int> s; s.insert(euler.size()); vector <int> adj; int cur=0; while(!s.empty()) { int nxt=*s.begin(); s.erase(nxt); if(cur==nxt) { cur++; continue; } for(int i=cur;i<=nxt-1;i++) Place[euler[i]]=1; int check_val=Ask(min(now, euler[cur]), max(now, euler[cur]), Place); for(int i=cur;i<=nxt-1;i++) Place[euler[i]]=0; if(check_val==0) { cur=nxt+1; continue; } s.insert(nxt); int l=cur, r=nxt-1; while(l!=r) { int mid=(l+r)/2; for(int i=l;i<=mid;i++) Place[euler[i]]=1; int val=Ask(min(now, euler[l]), max(now, euler[l]), Place); for(int i=l;i<=mid;i++) Place[euler[i]]=0; if(val==1) r=mid; else l=mid+1; } for(int i=l+1;i<euler.size();i++) if(euler[i]==euler[l]) s.insert(i); adj.push_back(euler[l]); cur=l+1; } tree[now].push_back(adj[0]); tree[adj[0]].push_back(now); for(int ele : adj) { v[ele].push_back(now); v[now].push_back(ele); } } void Detect(int T, int n) { N=n; Chk[0]=true; for(int i=1;i<N;i++) to_check.push_back(i); while(!to_check.empty()) { for(int i=0;i<N;i++) Place[i]=1; now=to_check.back(); to_check.pop_back(); new_check.push_back(now); if(!to_check.empty()) solv(0, to_check.size()-1); sort(new_check.begin(), new_check.end(), cmp1); solv_par(new_check[0], -1); for(int i=1;i<new_check.size();i++) { solv_par(new_check[i], new_check[i-1]); } for(int ele : new_check) Chk[ele]=true; new_check.clear(); to_check.clear(); for(int i=0;i<N;i++) if(!Chk[i]) to_check.push_back(i); } /*for(int i=0;i<N;i++) { printf("%d: ", i); for(int ele : v[i]) printf("%d ", ele); printf("\n"); }*/ for(int i=0;i<N;i++) { for(int ele : v[i]) if(ele<i) Answer(ele, i); } }

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

park.cpp: In function 'int solv_par(int, int)':
park.cpp:84:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |         for(int i=l+1;i<euler.size();i++) if(euler[i]==euler[l])  s.insert(i);
      |                       ~^~~~~~~~~~~~~
park.cpp:95:1: warning: no return statement in function returning non-void [-Wreturn-type]
   95 | }
      | ^
park.cpp: In function 'void Detect(int, int)':
park.cpp:109:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |         for(int i=1;i<new_check.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...