Submission #64064

#TimeUsernameProblemLanguageResultExecution timeMemory
64064Bodo171Min-max tree (BOI18_minmaxtree)C++14
0 / 100
1093 ms14568 KiB
#include <iostream> #include <fstream> #include <vector> using namespace std; const int nmax=70005; vector<int> v[nmax],ad[nmax]; pair<int,int> st[nmax],dr[nmax]; bool viz[nmax]; int l[nmax],r[nmax]; int rmq[20][nmax]; int tt[nmax],mark[nmax],first[nmax],lev[nmax]; int n,m,i,j,L,val,a,b,nr,niv,lg[nmax]; char ch; bool changed=0; int minlev(int A,int B) { if(lev[A]<lev[B]) return A; return B; } void build_rmq() { for(i=2;i<=n;i++) lg[i]=lg[i/2]+1; for(i=1;i<=17;i++) for(j=1;j<=nr-(1<<i)+1;j++) rmq[i][j]=minlev(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]); } void dfs(int x) { rmq[0][++nr]=x;first[x]=nr; for(int i=0;i<v[x].size();i++) if(!tt[v[x][i]]) { lev[v[x][i]]=lev[x]+1; tt[v[x][i]]=x; dfs(v[x][i]); rmq[0][++nr]=x; } } int lca(int unu,int doi) { unu=first[unu];doi=first[doi]; if(unu>doi) swap(unu,doi); niv=lg[doi-unu+1]; return minlev(rmq[niv][unu],rmq[niv][doi-(1<<niv)+1]); } void set_mn(int x,int y) { while(x!=L) { if(val>st[x].first) st[x]={val,i}; x=tt[x]; } while(y!=L) { if(val>st[y].first) st[y]={val,i}; y=tt[y]; } } void set_mx(int x,int y) { while(x!=L) { if(val<dr[x].first) dr[x]={val,i}; x=tt[x]; } while(y!=L) { if(val<dr[y].first) dr[y]={val,i}; y=tt[y]; } } bool cup(int x) { if(viz[x]) return 0; viz[x]=1; for(int i=0;i<ad[x].size();i++) if(!r[ad[x][i]]) { l[x]=ad[x][i]; r[ad[x][i]]=x; return 1; } for(int i=0;i<ad[x].size();i++) if(cup(r[ad[x][i]])) { l[x]=ad[x][i]; r[ad[x][i]]=x; return 1; } return 0; } int main() { //freopen("data.in","r",stdin); cin>>n; for(i=1;i<=n-1;i++) { cin>>a>>b; v[a].push_back(b); v[b].push_back(a); } tt[1]=-1; dfs(1); for(i=1;i<=n;i++) st[i]={-1,0},dr[i]={(1<<30),0}; build_rmq(); cin>>m; for(i=1;i<=m;i++) { cin>>ch>>a>>b>>val; L=lca(a,b); if(ch=='m') set_mn(a,b); else set_mx(a,b); } for(i=1;i<=n;i++) { if(st[i].second) ad[i].push_back(st[i].second); if(dr[i].second) ad[i].push_back(dr[i].second); } changed=1; while(changed) { changed=0; for(i=1;i<=n;i++) viz[i]=0; for(i=1;i<=n;i++) if((!l[i])&&cup(i)) changed=1; } for(i=2;i<=n;i++) { if(!l[i]) { if(st[i].second) val=st[i].first; if(dr[i].second) val=dr[i].first; cout<<i<<' '<<tt[i]<<' '<<val<<'\n'; } else { if(l[i]==st[i].second) val=st[i].first; else val=dr[i].first; cout<<i<<' '<<tt[i]<<' '<<val<<'\n'; } } return 0; }

Compilation message (stderr)

minmaxtree.cpp: In function 'void dfs(int)':
minmaxtree.cpp:31:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].size();i++)
                 ~^~~~~~~~~~~~
minmaxtree.cpp: In function 'void set_mn(int, int)':
minmaxtree.cpp:57:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
         if(val>st[y].first)
         ^~
minmaxtree.cpp:59:10: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
          y=tt[y];
          ^
minmaxtree.cpp: In function 'bool cup(int)':
minmaxtree.cpp:81:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<ad[x].size();i++)
                 ~^~~~~~~~~~~~~
minmaxtree.cpp:88:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<ad[x].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...