제출 #1246001

#제출 시각아이디문제언어결과실행 시간메모리
1246001dangkhoiSirni (COCI17_sirni)C++20
112 / 140
5111 ms498664 KiB
#pragma GCC optimize("Ofast,unroll-loops,fast-math,-ffloat-store") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma") #pragma GCC optimize("prefetch-loop-arrays,inline-functions,inline-small-functions,tree-loop-vectorize,tree-slp-vectorize,tree-loop-distribution") #include <bits/stdc++.h> using namespace std; #ifdef _WIN32 #define getchar_unlocked _getchar_nolock #endif inline unsigned int readunsignedint(){ unsigned int c=getchar_unlocked(),x=0; while(c<'0' or c>'9') c=getchar_unlocked(); for(;c>='0' and c<='9';c=getchar_unlocked()) x=(x<<3)+(x<<1)+(c-'0'); return x; } struct Edge{ unsigned int u,v; unsigned int w; Edge(unsigned int _u,unsigned int _v,unsigned int _w):u(_u),v(_v),w(_w){} Edge():u(0),v(0),w(0){} bool operator<(Edge const& o)const{return w<o.w;} }e[39000007]; struct DSU{ vector<unsigned int> par,rank; DSU(unsigned int n):par(n+1),rank(n+1){} void make_set(unsigned int u){ par[u]=u; rank[u]=0; } unsigned int find_set(unsigned int v){return par[v]==v?v:find_set(par[v]);} bool union_set(unsigned int u,unsigned int v){ u=find_set(u); v=find_set(v); if(u!=v){ if(rank[u]<rank[v]) swap(u,v); par[v]=u; if(rank[u]==rank[v]) rank[u]++; return 1; } else return 0; } }; unsigned int n; vector<unsigned int> p; unsigned int nxt[10000005],m=0; main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); n=readunsignedint(); p.resize(n); for(unsigned int i=0;i<n;i++) p[i]=readunsignedint(); sort(p.begin(),p.end()); p.erase(unique(p.begin(),p.end()),p.end()); n=p.size(); for(unsigned int i=0;i<n-1;i++){ nxt[p[i]]=i; for(unsigned int j=p[i]+1;j<p[i+1];j++) nxt[j]=i+1; } nxt[p[n-1]]=n-1; unsigned int mx=p[n-1]; for(unsigned int i=0;i<n;i++){ e[++m]={i,nxt[p[i]+1],p[nxt[p[i]+1]]%p[i]}; for(unsigned int j=p[i];j<=mx;j+=p[i]){ e[++m]={i,nxt[j],p[nxt[j]]%p[i]}; j=p[nxt[j]]/p[i]*p[i]; } } //----------------------------------------- sort(e+1,e+1+m); DSU d(n); for(unsigned int i=1;i<=n;i++) d.make_set(i); unsigned int total=0; unsigned int dem=0; for(unsigned int i=1;i<=m;i++){ auto [u,v,w]=e[i]; if(d.union_set(u,v)){ total+=w; if(++dem==n-1) break; } } cout<<total; }

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

sirni.cpp:46:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   46 | main()
      | ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...