제출 #1254648

#제출 시각아이디문제언어결과실행 시간메모리
1254648heozremix다리 (APIO19_bridges)C++20
0 / 100
451 ms589824 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #define ll long long #define pii pair <int ,int > #define fi first #define se second #define all(dataStructure) dataStructure.begin(), dataStructure.end() #define debug {cout << "chaizo\n"; exit(0);} using namespace std; const int N = 1e5; const ll inf32 = 1e9; const ll inf64 = 1e18; const int LOG = 26; const int BLOCK = 400; const int base = 3e7; int n , m , q; int type[N + 5] , x[N + 5] , y[N + 5]; int u[N + 5] , v[N + 5] , w[N + 5]; int ans[N + 5]; int Musashi_Miyamoto[N + 5] , Sasaki_Kojiro[N + 5] , cntA , cntB; bool isChange[N + 5]; vector < int > FitChange[BLOCK + 5] , Query; void init() { std::ios_base::sync_with_stdio(0); std::cin.tie(nullptr); std::cout.tie(nullptr); #define TASK "MEX" if (fopen(TASK".INP", "r")) { freopen(TASK".INP", "r", stdin); freopen(TASK".OUT", "w", stdout); } } struct DSU { int lab[N + 5]; pii history[2 * N + 5]; int id = 0; void resz(int nn){ for(int i = 1 ; i <= nn ; i ++) lab[i] = -1; id = 0; } int find_set(int u){ return lab[u] < 0 ? u : lab[u] = find_set(lab[u]); } void join(int u , int v) { u = find_set(u); v = find_set(v); history[++id] = {u , lab[u]}; history[++id] = {v , lab[v]}; if(lab[u] > lab[v]) swap(u , v); lab[u] += lab[v]; lab[v] = u; return; } void rollback(int past) { while(id > past) { lab[history[id].fi] = history[id].se; id --; } } } dsu; void process() { for(int l = 1 ; l <= q ; l += BLOCK) { int r = min(l + BLOCK - 1 , q); //reset dsu.resz(n); cntA = cntB = 0; Query.clear(); //pre process for(int i = l ; i <= r ; i ++) { if(type[i] == 1) isChange[x[i]] = true; else Query.emplace_back(i); FitChange[i - l].clear(); } for(int i = 1 ; i <= m ; i ++) { if(isChange[i]) Musashi_Miyamoto[++cntA] = i; else Sasaki_Kojiro[++cntB] = i; } sort(Sasaki_Kojiro + 1 , Sasaki_Kojiro + cntB + 1 , [](int i , int j) { return w[i] >= w[j]; }); sort(all(Query) , [](int i , int j){ return y[i] >= y[j]; }); for(int i = l ; i <= r ; i ++) { if(type[i] == 1) w[x[i]] = y[i]; else { for(int j = 1 ; j <= cntA ; j ++) if(w[Musashi_Miyamoto[j]] >= y[i]) FitChange[i - l].emplace_back(Musashi_Miyamoto[j]); } } int j = 1; for(int i : Query) { while(j <= cntB && w[Sasaki_Kojiro[j]] >= y[i]) { dsu.join(u[Sasaki_Kojiro[j]], v[Sasaki_Kojiro[j]]); j++; } int timeline = dsu.id; for(int &e : FitChange[i - l]) dsu.join(u[e] , v[e]); ans[i] = dsu.lab[dsu.find_set(x[i])]; dsu.rollback(timeline); } for(int i = l ; i <= r ; i ++) if(type[i] == 1) isChange[x[i]] = false; } for(int i = 1 ; i <= q ; i ++) if(type[i] == 2) cout << 0 - ans[i] << '\n'; } void read() { cin >> n >> m; for(int i = 1 ; i <= m ; i ++) cin >> u[i] >> v[i] >> w[i]; cin >> q; for(int i = 1 ; i <= q ; i ++) cin >> type[i] >> x[i] >> y[i]; } int main() { init(); int test_case; //cin >> test_case; test_case = 1; while (test_case--) { read(); process(); } return 0; }

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

bridges.cpp: In function 'void init()':
bridges.cpp:34:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |         freopen(TASK".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:35:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |         freopen(TASK".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...