제출 #1091074

#제출 시각아이디문제언어결과실행 시간메모리
1091074MrNanamaBitaro’s Party (JOI18_bitaro)C++17
7 / 100
2036 ms171344 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #define pb push_back #define fi first #define se second using namespace std; using ll = long long; template <typename T> ostream& operator<<(ostream& os, const vector<T>& vec){for (auto itr : vec){os << itr << " ";} return os;} ll n,m,q,block; vector<vector<ll>> neigh; vector<vector<pair<ll,ll>>> dp; /* pair<ll,ll> dfs(ll v, set<ll>& banned){ ll max_val = -1; ll max_node = -1; for(ll go:neigh[v]){ pair<ll,ll> p = dfs(go, banned); if(max_val <= p.fi+1 && p.se != -1){ max_val = p.fi+1; max_node = p.se; } } if(banned.count(v) == 0){ if(max_val <= 0){ max_val = 0; max_node = v; } } return {max_val, max_node}; } */ void solve(){ cin >> n >> m >> q; block = ceil(sqrt(n))+2; block = 100; neigh.resize(n); dp.assign(n, vector<pair<ll,ll>>(block, {-1,-1})); for(ll i=0; i<m; i++){ ll n1,n2; cin >> n1 >> n2; n1--; n2--; if(n1 < n2){swap(n1,n2);} neigh[n1].pb(n2); } for(ll i=0; i<n; i++){ //priority_queue<pair<ll,ll>> pq; //pq.push({0,i}); vector<ll> dist(n, -1); dist[i] = 0; for(ll go:neigh[i]){ for(pair<ll,ll> p:dp[go]){ //make sure break doesnt break if(p.se == -1){break;} dist[p.se] = max<ll>(dist[p.se], p.fi+1); //pq.push({p.fi+1, p.se}); } } vector<pair<ll,ll>> dist2(n); for(ll j=0; j<n; j++){ dist2[j] = {dist[j], j}; } sort(dist2.begin(), dist2.end(), greater<pair<ll,ll>>()); for(ll j=0; j<min<ll>(n,block); j++){ dp[i][j] = {dist2[j].fi, dist2[j].se}; } /* ll curr = 0; while(!pq.empty() && curr < block){ dp[i][curr] = pq.top(); pq.pop(); curr++; } */ } /* for(ll i=0; i<n; i++){ cout << i << ": "; for(ll j=0; j<block; j++){ cout << dp[i][j].fi << " "; } cout << endl; } */ vector<ll> dist(n, -1); stack<ll> banned_list; vector<ll> is_banned(n,0); for(ll i=0; i<q; i++){ ll n1, qnt; cin >> n1 >> qnt; n1--; for(ll j=0; j<qnt; j++){ ll c; cin >> c; c--; banned_list.push(c); is_banned[c] = 1; } if(banned_list.size() <= block-2){ for(ll j=0; j<block; j++){ if(is_banned[dp[n1][j].se] == 1){ continue; }else{ cout << dp[n1][j].fi << endl; break; } } }else{ fill(dist.begin(), dist.end(), -1); dist[n1] = 0; for(ll i=n1; i>=0; i--){ if(dist[i] == -1){continue;} for(ll go:neigh[i]){ dist[go] = max<ll>(dist[go], dist[i]+1); } } ll ans = -1; for(ll i=0; i<n; i++){ if(is_banned[i] == 0){ans = max<ll>(ans, dist[i]);} } cout << ans << endl; /* pair<ll,ll> p = dfs(n1,banned); cout << p.fi << endl; */ } while(banned_list.size() > 0){ ll c = banned_list.top(); is_banned[c] = 0; banned_list.pop(); } } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }

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

bitaro.cpp: In function 'void solve()':
bitaro.cpp:130:25: warning: comparison of integer expressions of different signedness: 'std::stack<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
  130 |   if(banned_list.size() <= block-2){
      |      ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...