Submission #283172

#TimeUsernameProblemLanguageResultExecution timeMemory
283172MKopchevToy Train (IOI17_train)C++14
11 / 100
1100 ms3328 KiB
#include "train.h" #include<bits/stdc++.h> using namespace std; const int nmax=1e4+42; int nxt[nmax]; vector<int> adj[nmax],trav[nmax],adj_comp[nmax]; int n,owner[nmax],charge[nmax]; int rec(int node)//1-> A wins, 0-> B wins { if(nxt[node]!=-1) { if(charge[node])return 1; int other=nxt[node]; while(other!=node) { if(charge[other])return 1; other=nxt[other]; } return 0; } for(auto k:adj[node]) { nxt[node]=k; int mem=rec(k); nxt[node]=-1; if(mem==owner[node])return mem; } return !owner[node]; } bool been[nmax]; stack<int> st; void dfs(int node) { if(been[node])return; been[node]=1; for(auto k:adj[node]) dfs(k); st.push(node); } int pointer,comp[nmax]; int mem[nmax]; int charge_comp[nmax]; vector<int> seen={}; set< pair<int,int> > edges; void dfs_trav(int node) { if(comp[node])return; comp[node]=pointer; seen.push_back(node); //charge_comp[pointer]=charge_comp[pointer]|charge[node]; for(auto k:trav[node]) dfs_trav(k); } int win(int node) { if(mem[node]!=-1)return mem[node]; int ret=charge_comp[node]; for(auto k:adj_comp[node]) ret=ret|win(k); mem[node]=ret; return ret; } bool b_win[nmax]; bool test(int node) { if(been[node])return 0; if(b_win[comp[node]])return 1; been[node]=1; for(auto k:adj[node]) if(test(k))return 1; return 0; } std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) { memset(mem,-1,sizeof(mem)); memset(nxt,-1,sizeof(nxt)); n=a.size(); for(int i=0;i<a.size();i++)owner[i]=a[i]; for(int i=0;i<r.size();i++)charge[i]=r[i]; for(int i=0;i<u.size();i++) if(charge[u[i]]==0&&charge[v[i]]==0) { adj[u[i]].push_back(v[i]); trav[v[i]].push_back(u[i]); edges.insert({u[i],v[i]}); } //B is owner of all for(int i=0;i<n;i++) if(been[i]==0)dfs(i); memset(been,0,sizeof(been)); while(st.size()) { seen={}; int tp=st.top(); //cout<<"tp= "<<tp<<endl; st.pop(); if(been[tp])continue; pointer++; dfs_trav(tp); if(seen.size()>=2||(seen.size()==1&&edges.count({seen[0],seen[0]}))) { b_win[pointer]=1; } //cout<<pointer<<" -> "<<b_win[pointer]<<endl; } for(int i=0;i<n;i++)adj[i]={}; for(int i=0;i<u.size();i++) adj[u[i]].push_back(v[i]); vector<int> outp={}; for(int i=0;i<n;i++) { memset(been,0,sizeof(been)); outp.push_back(1-test(i)); } /* for(int i=0;i<n;i++) { cout<<outp[i]<<" "<<rec(i)<<endl; } for(int i=0;i<n;i++) assert(rec(i)==outp[i]); */ return outp; }

Compilation message (stderr)

train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:123:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |     for(int i=0;i<a.size();i++)owner[i]=a[i];
      |                 ~^~~~~~~~~
train.cpp:125:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |     for(int i=0;i<r.size();i++)charge[i]=r[i];
      |                 ~^~~~~~~~~
train.cpp:127:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |     for(int i=0;i<u.size();i++)
      |                 ~^~~~~~~~~
train.cpp:165:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |     for(int i=0;i<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...