Submission #281721

#TimeUsernameProblemLanguageResultExecution timeMemory
281721groeneprofBridges (APIO19_bridges)C++14
14 / 100
692 ms24032 KiB
#include <bits/stdc++.h> #define P(a) do{if(debug) cout<<a<<endl;} while(false) #define H(a) P(#a<<": "<<a) #define FR(i,a,b) for(int i = (a); i<(b); i++) #define F(i,n) FR(i,0,n) const bool debug = 0; const int inf = 2e9; using namespace std; vector<vector<int> > ts, par, siz; vector<pair<int,int> > edges; vector<int> weights; int n, m, q; int root(int a,int t){ if(par[a].back() == a){ return a; } if(ts[a].back() > t){ ts[a].push_back(t); par[a].push_back(par[a].back()); siz[a].push_back(siz[a].back()); } return par[a].back() = root(par[a].back(),t); } void merge(int a, int b, int t){ P("a"); if(rand()%2) swap(a,b); int ra = root(a,t), rb = root(b,t); if(ra==rb) return; if(ts[ra].back()>t){ ts[ra].push_back(t); par[ra].push_back(par[ra].back()); siz[ra].push_back(siz[ra].back()); } if(ts[rb].back()>t){ ts[rb].push_back(t); par[rb].push_back(par[rb].back()); siz[rb].push_back(siz[rb].back()); } par[rb].back() = ra; siz[ra].back() += siz[rb].back(); } void generate(){ siz.resize(n,{1}); par.resize(n,{0}); ts.resize(n,{inf}); F(i,n){ par[i][0] = i; } vector<pair<int,pair<int,int> > > sorted(m); F(i, m){ sorted[i] = make_pair(weights[i],edges[i]); } sort(sorted.rbegin(), sorted.rend()); for(auto e : sorted){ merge(e.second.first, e.second.second, e.first); /*F(i,n){ cout<<i<<": "; F(j,par[i].size()){ cout<<"{"<<par[i][j]<<","<<siz[i][j]<<","<<ts[i][j]<<"} "; } cout<<endl; }*/ } /*F(i,n){ cout<<i<<": "; F(j,par[i].size()){ cout<<"{"<<par[i][j]<<","<<siz[i][j]<<","<<ts[i][j]<<"} "; } cout<<endl; }*/ } int root2(int a, int t){ int i = 0; for(int bit = 1<<20; bit>0; bit/=2){ if(i+bit<ts[a].size() && ts[a][i+bit] >= t){ i+=bit; } } if(par[a][i] == a) return a; return root2(par[a][i],t); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>m; edges.resize(m); weights.resize(m); F(i,m){ cin>>edges[i].first>>edges[i].second>>weights[i]; edges[i].first--; edges[i].second--; } generate(); cin>>q; F(i,q){ int type; cin>>type; if(type==1){ } else{ int a, t; cin>>a>>t; a--; int ra = root2(a,t); H(ra); int id = 0; for(int bit = 1<<20; bit>0; bit/=2){ if(id+bit<ts[ra].size() && ts[ra][id+bit] >= t){ id+=bit; } } cout<<siz[ra][id]<<endl; } } return 0; }

Compilation message (stderr)

bridges.cpp: In function 'int root2(int, int)':
bridges.cpp:83:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |   if(i+bit<ts[a].size() && ts[a][i+bit] >= t){
      |      ~~~~~^~~~~~~~~~~~~
bridges.cpp: In function 'int main()':
bridges.cpp:120:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |     if(id+bit<ts[ra].size() && ts[ra][id+bit] >= t){
      |        ~~~~~~^~~~~~~~~~~~~~
#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...