Submission #212260

#TimeUsernameProblemLanguageResultExecution timeMemory
212260zscoderStray Cat (JOI20_stray)C++17
100 / 100
133 ms21324 KiB
#include "Anthony.h" #include <vector> #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define fi first #define se second #define mp make_pair #define pb push_back #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<int,int> ii; typedef vector<int> vi; typedef long double ld; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds; vector<ii> vec; vector<ii> back; struct Graph { struct edge { int v; ll weight; }; vector<vector<edge> > adj; int n; Graph(int _n) { adj.resize(_n); n = _n; } void addedge(int u, int v, ll c) { edge tmp; tmp.v = v; tmp.weight = c; adj[u].pb(tmp); tmp.v = u; adj[v].pb(tmp); } void reset() { adj.clear(); } vector<ll> dist; vi par; void bfs(int s) { ll INFI = ll(1e18); dist.assign(n, INFI); par.assign(n, -1); dist[s] = 0; par[s] = -1; queue<int> q; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); for(int i = 0; i < adj[u].size(); i++) { int v = adj[u][i].v; if(dist[v] >= INFI) { vec.pb({u,v}); dist[v] = dist[u] + 1; par[v] = u; q.push(v); } else { back.pb({u,v}); } } } } }; vi chain = {1,0,0,1,1,0}; int col[22222]; vi adj[22222]; int par[22222]; void dfs(int u, int p, int chainno=-1) { int child=0; for(int v:adj[u]) { if(v==p) continue; par[v]=u; child++; } if(child>=2) { for(int v:adj[u]) { if(v==p) continue; col[v]=col[u]^1; dfs(v,u,-1); } } else if(child==1) { for(int v:adj[u]) { if(v==p) continue; if(chainno>=0) { col[v] = chain[(chainno+1)%6]; dfs(v,u,(chainno+1)%6); } else { col[v]=col[u]^1; if(col[v]==1) dfs(v,u,0); else dfs(v,u,1); } } } } std::vector<int> Mark(int N, int M, int A, int B, std::vector<int> U, std::vector<int> V) { std::vector<int> ans(M); int n=N; int m=M; Graph G(n); map<ii,int> ma; for(int i=0;i<m;i++) { G.addedge(U[i],V[i],1); ma[{U[i],V[i]}]=ma[{V[i],U[i]}]=i; adj[U[i]].pb(V[i]); adj[V[i]].pb(U[i]); } G.bfs(0); if(A>=3) { for(ii x:vec) { int ed = ma[x]; int mind = min(G.dist[x.fi],G.dist[x.se]); ans[ed]=mind%3; } for(ii x:back) { int ed = ma[x]; int mind = min(G.dist[x.fi],G.dist[x.se]); ans[ed]=mind%3; } return ans; } col[0]=0; dfs(0,-1); for(int i=1;i<n;i++) { ans[ma[{i,par[i]}]] = col[i]; } return ans; }
#include "Catherine.h" #include <vector> #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define fi first #define se second #define mp make_pair #define pb push_back #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<int,int> ii; typedef vector<int> vi; typedef long double ld; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds; namespace { int A, B; int beg = 0; int up=0; vi path; vi chain = {1,0,0,1,1,0}; } // namespace void Init(int A, int B) { ::A = A; ::B = B; ::beg = 0; ::up = 0; ::path.clear(); } int Move(std::vector<int> y) { if(A>=3) { int S[3]={}; int mx=0; for(int i=0;i<3;i++) { if(y[i]>0) { mx=i; S[i]=1; } } if(S[0]+S[1]+S[2]==1) return mx; if(S[0]&&S[1]) return 0; if(S[1]&&S[2]) return 1; return 2; } else { //rmb to check leaf case //cerr<<y[0]<<' '<<y[1]<<'\n'; if(up) //if we are certain we are going up { if(y[0]+y[1]==1) { if(y[0]==1){path.pb(0); return 0;} path.pb(1); return 1; } path.pb((path.back()^1)); return path.back(); } if(!beg) { if(y[0]+y[1]==1) { up=1; if(y[1]==1){path.pb(1); return 1;} else{path.pb(0); return 0;} } if(y[0]+y[1]>2) { up=1; if(y[0]==1){path.pb(0); return 0;} if(y[1]==1){path.pb(1); return 1;} assert(0); } if(y[0]>0) { y[0]--; path.pb(0); } else { y[1]--; path.pb(1); } if(y[0]>0) path.pb(0); else path.pb(1); reverse(path.begin(),path.end()); beg=1; return path.back(); } //got previous liao if(y[0]+y[1]==0) { up=1; return -1; //can go back } if(y[0]==0&&y[1]>1) { up=1; path.pb(0); return -1; } if(y[0]>1&&y[1]==0) { up=1; path.pb(1); return -1; } if(y[0]+y[1]>1) { up=1; y[path.back()]++; if(y[0]==1) { path.pb(0); return 0; } if(y[1]==1) { path.pb(1); return 1; } assert(0); } //chain now //cerr<<y[0]<<' '<<y[1]<<' '<<path[0]<<' '<<path.back()<<' '<<path.size()<<' '<<up<<'\n'; if(path.size()>=4) { vi V; for(int i=int(path.size())-4;i<int(path.size());i++) { V.pb(path[i]); } if(y[0]==1) { V.pb(0); } else { V.pb(1); } bool pos=0; for(int i=0;i<6;i++) { vi v2; for(int j=i;j<i+5;j++) { v2.pb(chain[j%6]); } if(v2==V){pos=1; break;} } if(pos) { up=1; return -1; } else up=1; } if(y[0]==1) { path.pb(0); return 0; } if(y[1]==1) { path.pb(1); return 1; } assert(0); } }

Compilation message (stderr)

Anthony.cpp: In member function 'void Graph::bfs(int)':
Anthony.cpp:68:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i = 0; i < adj[u].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...
#Verdict Execution timeMemoryGrader output
Fetching results...