제출 #1120740

#제출 시각아이디문제언어결과실행 시간메모리
11207400pt1mus23KOVANICE (COI15_kovanice)C++14
100 / 100
1028 ms75832 KiB
// Ali
 
// #pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define ins insert      
#define pii pair<int,int>
#define pb push_back
#define endl '\n'
#define putr(x) cout<<x<<endl;return; 
#define all(x) x.begin(),x.end()
const int mod = 1e9 +7, sze = 3e5+23, inf = 2e9, LG = 19,pr = 31;
int val[sze];
vector<int> graph[sze];
int used[sze];
int sub[sze];

void dfs(int node){
    if(used[node]){
        return;
    }
    sub[node]=1;
    used[node]=1;
    for(auto v:graph[node]){
        if(!used[v]){
            dfs(v);
        }
        sub[node]=max(sub[node],sub[v]+1);
    }
}

void dfs2(int node,int x){
    if(used[node] || !x){
        return;
    }
    used[node]=1;
    bool fu=false;
    // cout<<node<<endl;
    for(auto v:graph[node]){
        if(sub[v] == (x-1)){
            if(!used[v]){
                dfs2(v,x-1);
            }
            fu=true;
        }
    }
    if(fu || (graph[node].size()==0 && x==1)){
        val[node]=x;
    }
}

struct lan{
    vector<int> parent;
    vector<int> sz;
    lan(int n){
        parent.resize(n+23);
        iota(all(parent),0);
        sz.resize(n+23,1);
    }

    int root(int a){
        if(parent[a]==a){
            return a;
        }
        return parent[a]=root(parent[a]);
    }
    void unite(int a,int b){
        int x = root(a);
        int y = root(b);
        if(x!=y){
            if(sz[x]<sz[y]){
                swap(x,y);
            }
            sz[x]+=sz[y];
            parent[y]=x;
        }
    }
};
void fast(){
    int n,m,qq;
    cin>>n>>m>>qq;
    vector<pair<pii,char>> q;
    bool flag=false;
    while(qq--){
        string s;
        cin>>s;
        string a="";
        string b="";
        char op;
        for(auto v:s){
            if(v=='<' || v=='='){
                op = v;
                swap(a,b);
            }   
            else{
                a+=v;
            }
        }
        swap(a,b);
        q.pb({{stoll(a),stoll(b)},op});
        // cout<<a<<" "<<op<<" "<<b<<endl;
        if(op=='<' && !flag){
            flag=true;
        }
    }
    lan dsu(m+23);
    if(flag){
        vector<int> fk(m+23,0);
        set<int> lst;
        vector<pair<int,int>> fuk;
        for(auto [vv,op]:q){
            int a = vv.first;
            int b = vv.second;
            if(op=='='){
                dsu.unite(a,b);
            }
            else{
                // val[a]=1;
                // val[b]=2;
                // a<b ise ne olucak ?
                // en boyuk hansidi o lazim
                fuk.pb({a,b});
            }
        }
        set<pair<int,int>> gg;
        for(auto &v:fuk){
            v.first =dsu.root(v.first);
            v.second =dsu.root(v.second);
            lst.ins(v.first);
            lst.ins(v.second);
        }
        for(auto [k,v]:fuk){
            int a = dsu.root(k);
            if(a!=k && lst.find(k)!=lst.end()){
                lst.erase(k);
                // cout<<"silk "<<k<<endl;
            }
            int b = dsu.root(v);
            if(b!=v && lst.find(v)!=lst.end()){
                // cout<<" silv"<<v<<endl;
                lst.erase(v);
            }

            if(gg.find({b,a})==gg.end()){
                gg.ins({b,a});
                graph[b].pb(a);
            }
        }
        for(auto v:fuk){
            int a = dsu.root(v.first);
            // cout<<v.first<<" ,"<<v.second<<endl;
            if(lst.find(a)!=lst.end()){
                lst.erase(lst.find(a));
            }
        }
        // for(auto v:lst){
        //     cout<<v<<" ";
        // }cout<<endl;
        if(!lst.empty()){
            for(auto root:lst){
                dfs(root);
            }
            for(int i=0;i<sze;i++){
                used[i]=0;
            }
            for(auto root:lst){
                dfs2(root,n);
            }
        }
/*
2 5 3
1<2
3<2

3=4
*/


        for(int i =1;i<=m;i++){
            fk[dsu.root(i)]|=val[i];
        }
        for(int i =1;i<=m;i++){
            val[i]=fk[dsu.root(i)];
        }
    }

    for(int i=1;i<=m;i++){
        if(val[i]<=0){
            cout<<"?"<<endl;
        }
        else{
            cout<<"K"<<val[i]<<endl;
        }
    }
}
  
 
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int tt = 1;
    // cin>>tt;
 
    while(tt--){
        fast();
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

kovanice.cpp: In function 'void fast()':
kovanice.cpp:112:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  112 |         for(auto [vv,op]:q){
      |                  ^
kovanice.cpp:133:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  133 |         for(auto [k,v]:fuk){
      |                  ^
kovanice.cpp:103:9: warning: 'op' may be used uninitialized in this function [-Wmaybe-uninitialized]
  103 |         if(op=='<' && !flag){
      |         ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...