Submission #1041208

#TimeUsernameProblemLanguageResultExecution timeMemory
1041208YassirSalamaIsland Hopping (JOI24_island)C++17
100 / 100
5 ms860 KiB
#include "island.h" #include<bits/stdc++.h> using namespace std; #define F first #define S second #define all(v) v.begin(),v.end() #define pb push_back template<typename T> void dbg(const T& t){ cout<<t<<endl; } template<typename T,typename... Args> void dbg(const T&t,const Args&... args){ cout<<t<<" , "; dbg(args...); } #define dbg(...) cout<<"("<<#__VA_ARGS__<<"): ";dbg(__VA_ARGS__); set<int> seen; const int maxn=310; set<int> v[maxn]; map<pair<int,int>,int> mp; int q(int a,int b){ if(mp.count(make_pair(a,b))) return mp[make_pair(a,b)]; return mp[(make_pair(a,b))]=query(a,b); } bool visited[maxn]; void dfs(int node,int par){ visited[node]=1; for(auto x:v[node]){ if(x==par) continue; dfs(x,node); } } void solve(int N, int L) { vector<pair<int,int>> edges; map<pair<int,int>,bool> vis; int n=N; for(int node=1;node<=n;node++){ for(int j=1;j<n;j++){ int x=query(node,j); memset(visited,false,sizeof(visited)); dfs(node,-1); if(visited[x]){ break; } if(x>=node){ break; } if(vis.count({node,x})||vis.count({x,node})) continue; vis[{node,x}]=vis[{x,node}]=1; v[node].insert(x); v[x].insert(node); edges.pb({node,x}); } } for(auto x:edges){ answer(x.F,x.S); // dbg(x.F,x.S) } } #ifdef IOI #include <algorithm> #include <cstdio> #include <cstdlib> #include <random> #include <utility> #include <vector> #include "island.h" namespace { const int invalid_v_range = 1; const int invalid_k_range = 2; const int query_limit_exceeded = 3; const int invalid_xy_range = 4; const int no_edge = 5; const int answer_twice = 6; const int invalid_answer_times = 7; int N, L, ok; std::vector<int> A, B, answered; std::vector<std::vector<int>> g, dist, que; std::vector<std::pair<int, int>> p; int query_count = 0; int answer_count = 0; void wronganswer(int code) { printf("Wrong Answer [%d]\n", code); exit(0); } void dfs(int now, int pre, std::vector<std::vector<int>> &g, std::vector<int> &dist) { for (int nxt : g[now]) { if (nxt == pre) { continue; } dist[nxt] = dist[now] + 1; dfs(nxt, now, g, dist); } } } // namespace int query(int v, int k) { if (v < 1 || N < v) { wronganswer(invalid_v_range); } if (k < 1 || N - 1 < k) { wronganswer(invalid_k_range); } query_count++; if (query_count > L) { wronganswer(query_limit_exceeded); } return que[v - 1][k] + 1; } void answer(int x, int y) { if (x < 1 || N < x || y < 1 || N < y) { wronganswer(invalid_xy_range); } if (x > y) { std::swap(x, y); } answer_count++; if (answer_count > N - 1) { wronganswer(invalid_answer_times); } ok = -1; for (int i = 0; i < N - 1; i++) { if (A[i] == x && B[i] == y) { if (answered[i] != 0) { wronganswer(answer_twice); } ok = i; } } if (ok == -1) { wronganswer(no_edge); } answered[ok] = 1; } int main(int argc, char **argv) { if (scanf("%d", &N) != 1) { fprintf(stderr, "Error while reading input1.\n"); exit(1); } if (scanf("%d", &L) != 1) { fprintf(stderr, "Error while reading input2.\n"); exit(1); } A.resize(N - 1); B.resize(N - 1); answered.resize(N - 1, 0); g.resize(N); dist.resize(N, std::vector<int>(N)); que.resize(N); for (int i = 0; i < N - 1; i++) { if (scanf("%d", &A[i]) != 1) { fprintf(stderr, "Error while reading input3.\n"); exit(1); } if (scanf("%d", &B[i]) != 1) { fprintf(stderr, "Error while reading input4.\n"); exit(1); } } for (int i = 0; i < N - 1; i++) { if (A[i] >= B[i]) { std::swap(A[i], B[i]); } g[A[i] - 1].emplace_back(B[i] - 1); g[B[i] - 1].emplace_back(A[i] - 1); } for (int i = 0; i < N; i++) { dist[i][i] = 0; dfs(i, -1, g, dist[i]); p.clear(); for (int j = 0; j < N; j++) { p.emplace_back(dist[i][j], j); } std::sort(p.begin(), p.end()); for (int j = 0; j < N; j++) { que[i].emplace_back(p[j].second); } } solve(N, L); if (answer_count != N - 1) { wronganswer(invalid_answer_times); } printf("Accepted: %d\n", query_count); return 0; } #endif
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...