Submission #976780

#TimeUsernameProblemLanguageResultExecution timeMemory
9767808pete8Pipes (CEOI15_pipes)C++17
40 / 100
864 ms36644 KiB
#include<iostream> #include<stack> #include<map> #include<vector> #include<string> #include<unordered_map> #include <queue> #include<cstring> #include<limits.h> #include <cassert> #include<cmath> #include<set> #include<algorithm> #include <iomanip> #include<numeric> //gcd(a,b) #include<bitset> #include <cstdlib> #include <cstdint> using namespace std; #define ll long long #define f first //#define endl "\n" #define s second #define pii pair<int,int> #define ppii pair<int,pii> #define vi vector<int> #define pb push_back #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define F(n) for(int i=0;i<n;i++) #define lb lower_bound #define ub upper_bound #define fastio ios::sync_with_stdio(false);cin.tie(NULL); #pragma GCC optimize ("03,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; //#define int long long //#define double long double const int mxn=1e5,inf=1e9,minf=-1e9; int lg=0; vector<vector<int>>up; vector<vector<int>>adj; vector<int>h,par;//parent of comp(highest node) int lca(int a,int b){ if(h[a]<h[b])swap(a,b); int k=h[a]-h[b]; for(int i=0;i<=lg;i++)if(k&(1<<i))a=up[a][i]; if(a==b)return a; for(int i=lg;i>=0;i--)if(up[a][i]!=up[b][i])a=up[a][i],b=up[b][i]; return up[a][0]; } struct dsu{ vector<int>pa; void init(int n){ pa.assign(n+1,0); for(int i=1;i<=n;i++)pa[i]=i; } int find(int u){return (pa[u]==u)?u:pa[u]=find(pa[u]);} bool merg(int a,int b,int mode){ a=find(a),b=find(b); if(a==b)return 0; pa[a]=b; if(mode)par[b]=lca(par[b],par[a]); return 1; } }t,t2; bitset<mxn+10>vis; vector<vector<pii>>comp; void dfs(int cur,int p){ vis[cur]=1; comp.back().pb({h[cur],cur}); for(auto i:adj[cur])if(i!=p)h[i]=h[cur]+1,up[i][0]=cur,dfs(i,cur); } void getans(int cur,int p){ for(auto i:adj[cur])if(i!=p){ if(t2.find(cur)!=t2.find(i))cout<<cur<<" "<<i<<'\n'; getans(i,cur); } } int32_t main(){ fastio int n,m;cin>>n>>m; lg=log2(n)+1; up.resize(n+2); for(int i=0;i<=n;i++)up[i].resize(lg+2,0); adj.resize(n+1); int a,b; t.init(n); t2.init(n); h.assign(n+1,0); par.assign(n+1,0); for(int i=1;i<=n;i++)par[i]=i; for(int i=0;i<m;i++){ cin>>a>>b; if(t.merg(a,b,0)){ adj[a].pb(b); adj[b].pb(a); } else t2.merg(a,b,0); } vector<int>head; for(int i=1;i<=n;i++)if(!vis[i]){ comp.pb({}); head.pb(i); dfs(i,-1); } for(auto j:head)for(int i=1;i<=lg;i++)up[j][i]=j; for(int i=1;i<=lg;i++)for(int j=1;j<=n-1;j++)up[j][i]=up[up[j][i-1]][i-1]; for(int i=1;i<=n;i++){ int x=t2.find(i); if(par[x])par[x]=lca(par[x],i); else par[x]=i; } for(int i=0;i<comp.size();i++){ sort(rall(comp[i])); for(auto j:comp[i])if(h[par[t2.find(j.s)]]<h[j.s])t2.merg(j.s,up[j.s][0],1); } for(auto j:head)getans(j,-1); return 0; }

Compilation message (stderr)

pipes.cpp: In function 'int32_t main()':
pipes.cpp:114:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |  for(int i=0;i<comp.size();i++){
      |              ~^~~~~~~~~~~~
#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...