제출 #219101

#제출 시각아이디문제언어결과실행 시간메모리
219101alexandra_udristoiu조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++14
100 / 100
1760 ms56084 KiB
#include<iostream> #include<set> #include<vector> #define DIM 100005 using namespace std; int n, q, i, j, x, y, r1, r2, ry; long long sol; int r[DIM], num[DIM], nv[DIM]; vector<int> v[DIM], vr[DIM]; set<int> s[DIM], sr[DIM]; int rad(int x){ while(r[x] > 0){ x = r[x]; } return x; } void uneste(int r1, int r2){ int i, j, x, y, rx, ry; if(q == 1){ int abc = 0; } if(r[r1] > 0 || r[r2] > 0){ return; } if(r[r1] > r[r2]){ swap(r1, r2); } sol -= num[r1] * 1LL * (num[r1] - 1) + num[r1] * 1LL * nv[r1]; sol -= num[r2] * 1LL * (num[r2] - 1) + num[r2] * 1LL * nv[r2]; for(i = 0; i < vr[r2].size(); i++){ x = vr[r2][i]; vr[r1].push_back(x); if(s[x].find(r1) != s[x].end() ){ nv[r1]--; s[x].erase(r1); } for(j = 0; j < v[x].size(); j++){ y = v[x][j]; ry = rad(y); if(ry == r1 || ry == r2){ s[y].erase(r2); continue; } if(s[y].find(r1) == s[y].end() ){ s[y].insert(r1); nv[r1]++; } s[y].erase(r2); sr[ry].insert(r1); sr[ry].erase(r2); } } set<int> :: iterator it; for(it = sr[r2].begin(); it != sr[r2].end(); it++){ sr[r1].insert(*it); } r[r1] += r[r2]; r[r2] = r1; num[r1] += num[r2]; sr[r1].erase(r2); sol += num[r1] * 1LL * (num[r1] - 1) + num[r1] * 1LL * nv[r1]; for(it = sr[r2].begin(); it != sr[r2].end(); it++){ rx = rad(r1); ry = rad(*it); if(sr[ry].find(rx) != sr[ry].end() && rx != ry){ uneste(rx, ry); } } for(i = 0; i < vr[r2].size(); i++){ x = vr[r2][i]; for(j = 0; j < v[x].size(); j++){ y = v[x][j]; rx = rad(r1); ry = rad(y); if(sr[rx].find(ry) != sr[rx].end() && rx != ry){ uneste(rx, ry); } } } } int main(){ cin>> n >> q; for(i = 1; i <= n; i++){ r[i] = -1; num[i] = 1; vr[i].push_back(i); } for(; q; q--){ cin>> x >> y; v[y].push_back(x); r1 = rad(x); r2 = rad(y); if(r1 == r2){ cout<< sol <<"\n"; continue; } if(s[x].find(r2) == s[x].end() ){ sol += num[r2]; nv[r2]++; s[x].insert(r2); } sr[r1].insert(r2); if(sr[r2].find(r1) != sr[r2].end() ){ uneste(r1, r2); } cout<< sol <<"\n"; } }

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

joitter2.cpp: In function 'void uneste(int, int)':
joitter2.cpp:20:13: warning: unused variable 'abc' [-Wunused-variable]
         int abc = 0;
             ^~~
joitter2.cpp:30:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i = 0; i < vr[r2].size(); i++){
                ~~^~~~~~~~~~~~~~~
joitter2.cpp:37:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j = 0; j < v[x].size(); j++){
                    ~~^~~~~~~~~~~~~
joitter2.cpp:69:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i = 0; i < vr[r2].size(); i++){
                ~~^~~~~~~~~~~~~~~
joitter2.cpp:71:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j = 0; j < v[x].size(); j++){
                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...