Submission #491835

#TimeUsernameProblemLanguageResultExecution timeMemory
491835nikolapesic2802Bridges (APIO19_bridges)C++14
100 / 100
2023 ms321752 KiB
/*#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline") //Optimization flags #pragma GCC option("arch=native","tune=native","no-zero-upper") //Enable AVX #pragma GCC target("avx2") //Enable AVX*/ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <ext/rope> #define ll long long #define pb push_back #define sz(x) (int)(x).size() #define mp make_pair #define f first #define s second #define all(x) x.begin(), x.end() #define D(x) cerr << #x << " is " << (x) << "\n"; using namespace std; using namespace __gnu_pbds; using namespace __gnu_cxx; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; ///find_by_order(),order_of_key() template<class T1, class T2> ostream& operator<<(ostream& os, const pair<T1,T2>& a) { os << '{' << a.f << ", " << a.s << '}'; return os; } template<class T> ostream& operator<<(ostream& os, const vector<T>& a){os << '{';for(int i=0;i<sz(a);i++){if(i>0&&i<sz(a))os << ", ";os << a[i];}os<<'}';return os;} template<class T> ostream& operator<<(ostream& os, const deque<T>& a){os << '{';for(int i=0;i<sz(a);i++){if(i>0&&i<sz(a))os << ", ";os << a[i];}os<<'}';return os;} template<class T> ostream& operator<<(ostream& os, const set<T>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;} template<class T> ostream& operator<<(ostream& os, const set<T,greater<T> >& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;} template<class T> ostream& operator<<(ostream& os, const multiset<T>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;} template<class T> ostream& operator<<(ostream& os, const multiset<T,greater<T> >& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;} template<class T1,class T2> ostream& operator<<(ostream& os, const map<T1,T2>& a) {os << '{';int i=0;for(auto p:a){if(i>0&&i<sz(a))os << ", ";os << p;i++;}os << '}';return os;} const int N=1e5+500; int L,M; int u[N],v[N],w[N],last[N],qu[N],qw[N],ans[N]; vector<int> pojedinacno[N]; vector<pair<int,int> > arr[N]; int n,m,q,tr; void add(int l,int r,int in,int w){ //printf("%i-%i %i: %i %i %i\n",l,r,in,u[in],v[in],w); int le=l/L,ri=r/L; if(le==ri){ if(l==le*L&&r==min(tr-1,(ri+1)*L-1)){ arr[le].pb({w,in}); return; } for(int i=l;i<=r;i++) if(qw[i]<=w) pojedinacno[i].pb(in); return; } if(l==le*L) le--; else for(int i=l;i<(le+1)*L;i++) if(qw[i]<=w) pojedinacno[i].pb(in); if(r==min(tr-1,(ri+1)*L-1)){ for(int i=le+1;i<=ri;i++) arr[i].pb({w,in}); } else{ for(int i=le+1;i<ri;i++) arr[i].pb({w,in}); for(int i=ri*L;i<=r;i++) if(qw[i]<=w) pojedinacno[i].pb(in); } } struct DSU{ vector<int> p,siz,in,undo; DSU(){p.resize(N);siz.resize(N,1);in.resize(N);iota(all(p),0);} void reset(){ for(auto d:undo) p[d]=d,in[d]=0,siz[d]=1; undo.clear(); } int find(int tr){return tr==p[tr]?tr:p[tr]=find(p[tr]);} void merge(int a,int b){ a=find(a); b=find(b); if(!in[a]) in[a]=1,undo.pb(a); if(a==b) return; if(!in[b]) in[b]=1,undo.pb(b); if(siz[a]<siz[b]){ siz[b]+=siz[a]; p[a]=b; } else{ siz[a]+=siz[b]; p[b]=a; } } }; void solve(){ DSU global,moj; for(int i=0;i<M;i++){ global.reset(); vector<pair<pair<int,int>,int> > query; for(int j=i*L;j<(i+1)*L&&~qu[j];j++) query.pb({{qw[j],qu[j]},j}); //cout << arr[i] << query << endl; sort(all(query)); reverse(all(query)); int ind=0; //printf("%i:-----------------------------------\n",i); for(auto p:query){ //printf("Racunam %i %i\n",p.f.f,p.f.s); while(ind<arr[i].size()&&arr[i][ind].f>=p.f.f) global.merge(u[arr[i][ind].s],v[arr[i][ind].s]),ind++; moj.reset(); for(auto d:pojedinacno[p.s]){ int uu=global.find(u[d]),vv=global.find(v[d]); //printf("Moj %i %i %i %i\n",uu,vv,moj.siz[uu],moj.siz[vv]); if(moj.siz[uu]<global.siz[uu]) moj.siz[uu]=global.siz[uu]; if(moj.siz[vv]<global.siz[vv]) moj.siz[vv]=global.siz[vv]; //printf("Moj %i %i %i %i\n",uu,vv,moj.siz[uu],moj.siz[vv]); moj.merge(uu,vv); } ans[p.s]=max(moj.siz[moj.find(global.find(p.f.s))],global.siz[moj.find(global.find(p.f.s))]); } for(int j=i*L;j<(i+1)*L&&~qu[j];j++) printf("%i\n",ans[j]); } } int main() { for(int i=0;i<N;i++) qu[i]=-1; //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); //n=50000; //m=100000; //int d=1e9; scanf("%i %i",&n,&m); for(int i=0;i<m;i++){ //u[i]=rng()%n;v[i]=rng()%n;w[i]=rng()%d; scanf("%i %i %i",&u[i],&v[i],&w[i]),u[i]--,v[i]--; } //q=100000; scanf("%i",&q); vector<tuple<int,int,int,int> > ad; for(int i=0;i<q;i++){ int t,a,b; //t=rng()%2+1; //a=rng()%n; //b=rng()%d; scanf("%i %i %i",&t,&a,&b); a--; if(t==2){ qu[tr]=a; qw[tr++]=b; }else{ if(last[a]!=tr) ad.pb(make_tuple(w[a],tr-1,a,last[a])); last[a]=tr; w[a]=b; } } for(int i=0;i<m;i++) if(last[i]!=tr) ad.pb(make_tuple(w[i],tr-1,i,last[i])); int d=sqrt(tr); L=d; if(tr==q) L=tr; M=N/L; sort(all(ad)); reverse(all(ad)); for(auto p:ad){ int a,b,c,d; tie(d,b,c,a)=p; add(a,b,c,d); } solve(); return 0; }

Compilation message (stderr)

bridges.cpp: In function 'void solve()':
bridges.cpp:114:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |             while(ind<arr[i].size()&&arr[i][ind].f>=p.f.f)
      |                   ~~~^~~~~~~~~~~~~~
bridges.cpp: In function 'int main()':
bridges.cpp:135:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  135 |     for(int i=0;i<N;i++)
      |     ^~~
bridges.cpp:142:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  142 |  scanf("%i %i",&n,&m);
      |  ^~~~~
bridges.cpp:142:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  142 |  scanf("%i %i",&n,&m);
      |  ~~~~~^~~~~~~~~~~~~~~
bridges.cpp:145:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  145 |         scanf("%i %i %i",&u[i],&v[i],&w[i]),u[i]--,v[i]--;
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:148:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |     scanf("%i",&q);
      |     ~~~~~^~~~~~~~~
bridges.cpp:155:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  155 |         scanf("%i %i %i",&t,&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...