Submission #1295182

#TimeUsernameProblemLanguageResultExecution timeMemory
1295182ulvixKOVANICE (COI15_kovanice)C++20
100 / 100
175 ms56100 KiB
#include <bits/stdc++.h> #ifdef ULVI #define db(x) cerr<<"[ "<<#x<<" = "<<(x)<<" ]\n" #define dbv(v) cerr<<#v<<" = [ ";for(auto &__x : v)cerr<<__x<<' ';cerr<<"]\n" #define line() cerr<<string(80, '-')<<'\n' #else #define db(x) #define dbv(v) #define line() #endif #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define ff first #define ss second #define enld endl using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef pair<ll,ll> pll; const ll sz=3e5+100; const ll mod=1e9+7; const ll inf=1e18; template<class T> using indexed_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); vector<ll> par(sz),g[sz]; ll findp(ll x){ if(par[x]==x) return x; return par[x]=findp(par[x]); } bool unite(ll a,ll b){ a=findp(a); b=findp(b); if(a==b) return 0; par[b]=a; return 1; } void solve(){ ll n,m,q; cin>>n>>m>>q; vector<pll> less; for(ll i=1;i<=m;i++) par[i]=i; for(ll i=0;i<q;i++){ string s; cin>>s; ll pos=-1; for(ll i=0;i<s.size();i++){ if(s[i]=='<' || s[i]=='='){ pos=i; break; } } ll a=stoll(s.substr(0,pos)),b=stoll(s.substr(pos+1)); if(s[pos]=='<') less.push_back({a,b}); else unite(a,b); } ll comp=1; vector<ll> root(m+5); vector<ll> compid(m+5); map<ll,ll> mp; for(ll i=1;i<=m;i++) root[i]=findp(i); for(ll i=1;i<=m;i++){ ll r=root[i]; if(!mp.count(r)){ mp[r]=comp; compid[i]=comp; comp++; } else compid[i]=mp[r]; } for(auto [a,b]:less) g[compid[a]].push_back(compid[b]); for(ll i=1;i<comp;i++){ if(g[i].empty()) continue; sort(all(g[i])); g[i].erase(unique(all(g[i])),g[i].end()); } vector<ll> indeg(comp+5); for(ll i=1;i<comp;i++) for(ll j:g[i]) indeg[j]++; queue<ll> qq; vector<ll> topo; for(ll i=1;i<comp;i++) if(!indeg[i]) qq.push(i); while(!qq.empty()){ ll node=qq.front(); qq.pop(); topo.push_back(node); for(ll i:g[node]){ indeg[i]--; if(!indeg[i]) qq.push(i); } } vector<ll> mn(comp+5,1),mx(comp+5,n); for(ll i:topo) for(ll j:g[i]) mn[j]=max(mn[j],mn[i]+1); reverse(all(topo)); for(ll i:topo) for(ll j:g[i]) mx[i]=min(mx[i],mx[j]-1); for(ll i=1;i<=m;i++){ ll c=compid[i]; if(mn[c]==mx[c]) cout<<'K'<<mn[c]<<'\n'; else cout<<"?\n"; } } int main(){ //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); ll t=1; //cin>>t; for(ll _=1;_<=t;_++){ //cout<<"Scenario #"<<_<<":\n"; solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...