제출 #1355846

#제출 시각아이디문제언어결과실행 시간메모리
1355846tamerrKOVANICE (COI15_kovanice)C++20
0 / 100
404 ms589824 KiB

#include "bits/stdc++.h"
using namespace std;
using ll=long long;
using ull=unsigned long long;
#define speed ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define endl "\n"
#define int ll
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(),v.end()
const int sz = 5e5 + 9;	
const int oo = 1e18 + 7;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int phi(int n){
    int res=n;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            while(n%i==0)
            n/=i;
            res-=res/i;
        }
    }   
    if(n>1)
    res-=res/n;
    return res;
}
int binpow(int x, int y,int MOD){
    if(!y) return 1;
    int res = binpow(x, y / 2,MOD);
    if(y % 2 == 1) 
    return (((res%MOD)*(res%MOD))%MOD)*(x%MOD)%MOD;
    return ((res%MOD)*(res%MOD))%MOD;
}
int inv(int n){
    return binpow(n,mod-2,mod);
}
int gcd(int a, int b) {
    if (b == 0)
    return a;
    return gcd(b, a % b); 
}
// vector<int>prime;
// vector<bool>primes(sz, true);
// void sieve()
// {
//     primes[0] = primes[1] = false;
//     for(int i = 2; i * i < sz; i++){
//         if(primes[i] == false)
//             continue;
//         for(int j = i * i; j < sz; j += i)
//         primes[j] = false;
//     }
//     for(int i = 0; i < sz; i++){
//         if(primes[i] == true)
//             prime.push_back(i);
//     }
// }
vector<int>e;
vector<vector<int>>g(sz);
int get(int x)
{
    if(e[x]<=0)
    return x;
    return e[x]=get(e[x]);
}
bool sameset(int x,int y)
{
    x=get(x);
    y=get(y);
    return (x==y);
}
bool uni(int x,int y)
{
    x=get(x);
    y=get(y);
    if(e[x]>e[y])
    swap(x,y);
    // e[x]+=e[y];
    e[y]=x;
    return true;
}
void solve(){
    int n,m,qq;
    cin>>n>>m>>qq;
    e.resize(m+1,0);
    vector<int>ans(m+1,-1);
    vector<int>deg(m+1,-1);
    vector<pair<int,int>>que;
    while(qq--)
    {
        int a,b;
        char c;
        cin>>a>>c>>b;
        if(c=='=')
        que.pb({a,b});
        else
        {
            g[a].pb(b);
            if(deg[a]==-1)
            deg[a]=0;
            if(deg[b]==-1)
            deg[b]=0;
            deg[b]++;
        }
    }
    vector<int>topo;
    queue<int>q;
    for(int i=1;i<=m;i++)
    {
        if(deg[i]==0)
        {
            q.push(i);
        }
    }
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        topo.pb(u);
        for(auto v : g[u])
        {
            deg[v]--;
            if(deg[v]==0)
            q.push(v);
        }
    }
    if(topo.size()!=n)
    {
        for(int i=1;i<=m;i++)
        cout<<'?'<<endl;
    }
    for(int i=1;i<=n;i++)
    {
        e[topo[i-1]]=-i;
    }
    for(auto [a,b] : que)
    uni(a,b);
    for(int i=1;i<=m;i++)
    {
        if(e[i]>=0)
        {
            if(e[e[i]]>=0)
            cout<<'?'<<endl;
            else
            cout<<'K'<<-e[e[i]]<<endl;
        }
        else
        cout<<'K'<<-e[i]<<endl;
    }
}
signed main()
{
    speed;
    int tt=1; 
    // cin >> tt;
    while(tt--)
    {    
       solve();
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…