# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
976782 | 2024-05-07T06:17:47 Z | 8pete8 | Pipes (CEOI15_pipes) | C++17 | 801 ms | 20164 KB |
#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 bfs(int cur,int p){ queue<pii>q; q.push({cur,p}); while(!q.empty()){ int cc=q.front().f,cp=q.front().s; q.pop(); if(vis[cc])continue; vis[cc]=1; comp.back().pb({h[cc],cc}); for(auto i:adj[cc]){ if(i==cp)continue; h[i]=h[cc]+1; up[i][0]=cc; q.push({i,cc}); } } } void getans(int cur,int p){ queue<pii>q; q.push({cur,p}); while(!q.empty()){ int cc=q.front().f,cp=q.front().s; q.pop(); if(vis[cur])continue; vis[cur]=1; for(auto i:adj[cc]){ if(i==cp)continue; if(t2.find(cc)!=t2.find(i))cout<<cc<<" "<<i<<'\n'; q.push({i,cc}); } } } 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); bfs(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(int i=1;i<=n;i++)vis[i]=0; for(auto j:head)getans(j,-1); return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 0 ms | 348 KB | Wrong number of edges |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 3 ms | 1116 KB | Wrong number of edges |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 66 ms | 1008 KB | Output is correct |
2 | Incorrect | 63 ms | 964 KB | Wrong number of edges |
3 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 112 ms | 2116 KB | Output is correct |
2 | Incorrect | 138 ms | 2388 KB | Wrong number of edges |
3 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 196 ms | 4812 KB | Output is correct |
2 | Incorrect | 187 ms | 5876 KB | Wrong number of edges |
3 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 286 ms | 14704 KB | Output is correct |
2 | Incorrect | 250 ms | 14552 KB | Wrong number of edges |
3 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 428 ms | 16684 KB | Memory limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 558 ms | 20120 KB | Memory limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 679 ms | 20164 KB | Memory limit exceeded |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Runtime error | 801 ms | 19236 KB | Memory limit exceeded |
2 | Halted | 0 ms | 0 KB | - |