제출 #1170846

#제출 시각아이디문제언어결과실행 시간메모리
1170846SmuggingSpun조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++20
0 / 100
0 ms396 KiB
#include<bits/stdc++.h> #define taskname "B" using namespace std; typedef long long ll; int n, m; namespace sub1{ void solve(){ vector<ll>g(n, 0), _g; for(int _ = 0; _ < m; _++){ int u, v; cin >> u >> v; g[--u] |= 1LL << --v; _g = g; while(true){ bool flag = false; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(1LL << j & _g[i]){ for(int k = 0; k < n; k++){ if(k != i && k != j && (1LL << j & _g[k]) && (1LL << k & _g[j]) && ((_g[i] >> ll(k) & 1LL) == 0)){ _g[i] |= 1LL << k; flag = true; } } } } } if(!flag){ break; } } int ans = 0; for(int i = 0; i < n; i++){ ans += __builtin_popcountll(_g[i]); } cout << ans << "\n"; } } } namespace sub2{ const int lim = 2e3 + 1; void solve(){ vector<int>parent(n + 1); vector<vector<int>>vertex(n + 1); vector<bitset<lim>>g(n + 1), in(n + 1); for(int i = 1; i <= n; i++){ g[i].reset(); in[i].reset(); } int cnt = 0; auto find_set = [&] (int N){ while(N != parent[N]){ N = parent[N] = parent[parent[N]]; } return N; }; auto merge = [&] (int u, int v){ u = find_set(u); v = find_set(v); for(int i = 1; i <= n; i++){ if(in[u].test(i) && u != find_set(i)){ cnt -= vertex[u].size(); } if(in[v].test(i) && v != find_set(i)){ cnt -= vertex[v].size(); } } in[parent[v] = u] |= in[v]; for(int& j : vertex[v]){ vertex[u].emplace_back(j); } for(int i = 1; i <= n; i++){ if(in[u].test(i) && u != find_set(i)){ cnt += vertex[u].size(); } } }; for(int i = 1; i <= n; i++){ vertex[i].emplace_back(parent[i] = i); } for(int _ = 0; _ < m; _++){ int u, v; cin >> u >> v; if(find_set(u) != find_set(v) && !in[find_set(v)].test(u)){ g[u].set(v); cnt += vertex[find_set(v)].size(); in[find_set(v)].set(u); bool flag = false; for(int i = 1; i <= n; i++){ if((find_set(i) == find_set(v) && g[i].test(u)) || (i == find_set(u) && g[v].test(i))){ flag = true; break; } } if(flag){ merge(u, v); } } int ans = cnt; for(int i = 1; i <= n; i++){ if(i == find_set(i)){ ans += vertex[i].size() * (int(vertex[i].size()) - 1); } } cout << ans << "\n"; } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen(taskname".inp", "r")){ freopen(taskname".inp", "r", stdin); } cin >> n >> m; if(n <= 50){ sub2::solve(); } else if(n <= 2000){ sub2::solve(); } }

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

joitter2.cpp: In function 'int main()':
joitter2.cpp:112:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  112 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...