General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
236716502 Practice:
cnyzz
1904F - 30 C++20 (GCC 11-64) Accepted 2105 ms 408600 KB 2023-12-11 05:16:37 2023-12-11 05:16:37
→ Source
/*
Author: cnyz
世界があたしを拒んでも今 愛の唄 歌わせてくれないかな
*/
#include<bits/stdc++.h>
using namespace std;

using db=double;
using ll=long long;
using vi=vector<int>;
using pii=pair<int,int>;
using ull=unsigned long long;

#define fi first
#define se second
#define gc getchar
#define pb emplace_back
#define mkp make_pair
#define push emplace
#define sz(a) (int)a.size()
#define all(p) p.begin(),p.end()
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define ppc(x) __builtin_popcount(x)
#define clz(x) __builtin_clz(x)

bool Mbe;

void chkmax(int &x,int y) {if(x<y) x=y;}
void chkmin(int &x,int y) {if(x>y) x=y;}
void chkmax(ll &x,ll y) {if(x<y) x=y;}
void chkmin(ll &x,ll y) {if(x>y) x=y;}
int read() { int x; cin>>x; return x; }

const int N=2e5+5;
int n;
vi G[N],dag[N*40];
int dfn[N],dep[N],top[N],par[N],siz[N],dfc,deg[N*40];
int dn[18][N],up[18][N];
void dfs(int u,int fa) {
    par[u]=fa,dep[u]=dep[fa]+1,siz[u]=1;
    for(int &v:G[u]) if(v!=fa) {
        dfs(v,u); siz[u]+=siz[v];
        if(G[u][0]==fa||siz[G[u][0]]<siz[v]) swap(G[u][0],v);
    }
}
void dfs2(int u,int tp) {
    dfn[u]=++dfc,top[u]=tp;
    for(int v:G[u]) if(v!=par[u]) {
        if(v==G[u][0]) dfs2(v,tp);
        else dfs2(v,v);
    }
}
void getedge(int l,int r,int x,int t) {
    if(l>r) return;
    if(l<=dfn[x]&&dfn[x]<=r) {
        getedge(l,dfn[x]-1,x,t),getedge(dfn[x]+1,r,x,t);
        return;
    }
    else {
        int k=__lg(r-l+1);
        if(t==1) dag[x].pb(dn[k][l]),dag[x].pb(dn[k][r-(1<<k)+1]);
        else dag[up[k][l]].pb(x),dag[up[k][r-(1<<k)+1]].pb(x);
    }
}
void add(int a,int b,int c,int t) {
    while(top[a]!=top[b]) {
        if(dep[top[a]]>dep[top[b]]) swap(a,b);
        getedge(dfn[top[b]],dfn[b],c,t);
        b=par[top[b]];
    }
    if(dep[a]>dep[b]) swap(a,b);
    getedge(dfn[a],dfn[b],c,t);
}
void solve() {
    n=read(); int m=read();
    FOR(i,1,n-1) {
        int x=read(),y=read();
        G[x].pb(y),G[y].pb(x);
    }
    dfs(1,0); dfs2(1,1);
    FOR(i,1,n) dn[0][dfn[i]]=up[0][dfn[i]]=i;
    int idc=n;
    FOR(i,1,17) FOR(j,1,n-(1<<i)+1) {
        dn[i][j]=++idc,up[i][j]=++idc;
        // printf("%d %d dn %d up %d\n",i,j,idc-1,idc);
        dag[dn[i][j]].pb(dn[i-1][j]);
        dag[dn[i][j]].pb(dn[i-1][j+(1<<(i-1))]);
        dag[up[i-1][j]].pb(up[i][j]);
        dag[up[i-1][j+(1<<(i-1))]].pb(up[i][j]);
    }
    FOR(i,1,m) {
        int typ=read(),a=read(),b=read(),c=read();
        add(a,b,c,typ);
    }
    FOR(i,1,idc) for(int v:dag[i]) deg[v]++;
    queue<int> q; vi o,oo;
    FOR(i,1,idc) if(deg[i]==0) q.push(i);
    while(sz(q)) {
        int u=q.front(); q.pop();
        if(u<=n) o.pb(u);
        for(int v:dag[u]) {
            deg[v]--;
            if(!deg[v]) q.push(v);
        }
    }
    if(sz(o)!=n) { cout<<-1<<'\n'; return; }
    oo.resize(n+1);
    FOR(i,0,n-1) oo[o[i]]=i+1;
    FOR(i,1,n) cout<<oo[i]<<' ';
}

bool Med;
int main() {
    ios::sync_with_stdio(false),cin.tie(0);
    // fprintf(stderr, "%.3lf MB\n", (&Med - &Mbe) / 1048576.0);
    int T=1;
    while(T--) solve();
    // fprintf(stderr, "%d ms\n", int(1e3 * clock() / CLOCKS_PER_SEC));
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details