제출 #212511

#제출 시각아이디문제언어결과실행 시간메모리
212511brcodeBitaro’s Party (JOI18_bitaro)C++14
7 / 100
2092 ms17912 KiB
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
const int sqrtn = 320;
int w,e;
vector<pair<int,int>> res;
int n,m,q;
bool blocked[MAXN];
int dp[MAXN];
vector<int> v1[MAXN];
vector<int> v1rev[MAXN];
vector<pair<int,int>> temp[MAXN];
vector<int> hold;
void merge(vector<pair<int,int>> a,vector<pair<int,int>> b){
    
    for(int i=0;i<b.size();i++){
        a.push_back(make_pair(b[i].first+1,b[i].second));
        
    }
    //dist,node
    sort(a.begin(),a.end());
    reverse(a.begin(),a.end());
    int cnt = 0;
    map<int,int> m1;
    for(int i=0;i<a.size() && cnt<=sqrtn;i++){
        if(!m1[a[i].second]){
            //if node not seen yet, add it to possible nodes,set it tp the distance
            m1[a[i].second] = a[i].first;
            cnt++;
        }else{
            m1[a[i].second] = max(m1[a[i].second],a[i].first);
        }
        
    }
    res.clear();
    for(auto x = m1.begin();x!=m1.end();x++){
        res.push_back(make_pair(x->second,x->first));
    }
    reverse(res.begin(),res.end());
    while(res.size()>sqrtn){
        res.pop_back();
    }
}
int dodp(int t){
    for(int i=1;i<=n;i++){
        blocked[i] = false;
        dp[i] = 0;
    }
    for(int i=0;i<hold.size();i++){
        blocked[hold[i]] = true;
    }
    for(int i=1;i<=n;i++){
        if(blocked[i]){
            dp[i] = -1e9;
        }else{
            dp[i] = 0;
        }
        for(int x:v1rev[i]){
            dp[i] = max(dp[i],dp[x]+1);
        }
    }
    return max(-1,dp[t]);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n>>m>>q;
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        v1[u].push_back(v);
        v1rev[v].push_back(u);
        //v1rev -> backwards
    }
    for(int i=1;i<=n;i++){
        
            temp[i].push_back(make_pair(0,i));
        for(int x:v1rev[i]){
            w=i;
            e=x;
           //temp[v].push_back(make_pair(1,1));
           
            merge(temp[i],temp[x]);
            //Keep merging temp[i] with nodes which connect to it to find furthest nodes
            temp[i].clear();
            for(auto y:res){
                temp[i].push_back(y);
               // cout<<i<<" "<<y.first<<" "<<y.second<<endl;
            }
        }
        for(auto y:temp[i]){
          //  cout<<i<<" "<<y.second<<" "<<y.first<<endl;
        }
    }
    for(int i=1;i<=n;i++){
        sort(temp[i].begin(),temp[i].end());
        reverse(temp[i].begin(),temp[i].end());
    }
    
    while(q--){
        
        int t,c;
        cin>>t>>c;
      //  cout<<t<<" "<<c<<endl;
        hold.clear();
       // set<int> s1;
        for(int i=1;i<=c;i++){
            int x;
            cin>>x;
            hold.push_back(x);
            //s1.insert(x);
        }
        sort(hold.begin(),hold.end());
        if(hold.size()>sqrtn){
            cout<<dodp(t)<<"\n";
        }else{
            bool ok = false;
            for(auto x:temp[t]){
                if(!binary_search(hold.begin(),hold.end(),x.second)){
                    cout<<x.first<<"\n";
                    ok = true;
                    break;
                }
            }
            if(!ok){
                cout<<-1<<"\n";
            }
        }
        
    }
}

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

bitaro.cpp: In function 'void merge(std::vector<std::pair<int, int> >, std::vector<std::pair<int, int> >)':
bitaro.cpp:17:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<b.size();i++){
                 ~^~~~~~~~~
bitaro.cpp:26:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<a.size() && cnt<=sqrtn;i++){
                 ~^~~~~~~~~
bitaro.cpp: In function 'int dodp(int)':
bitaro.cpp:50:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<hold.size();i++){
                 ~^~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:92:18: warning: variable 'y' set but not used [-Wunused-but-set-variable]
         for(auto y:temp[i]){
                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...