#include<bits/stdc++.h>
using namespace std ;
#define maxn 300009
#define ll long long
#define pb push_back
#define fi first
#define se second
#define left id<<1
#define right id<<1|1
#define re exit(0);
#define _lower(x) lower_bound(v.begin(),v.end(),x)-v.begin()+1
#define TIME ( 1.0*clock() / CLOCKS_PER_SEC )
#define CEIL(a,b) (a/b + (a%b!=0))
const int mod = 1e9+7 ;
const int INF = 1e9 ;
typedef vector<int> vi ;
typedef pair<int,int> pii ;
typedef vector<pii> vii ;
template < typename T > void chkmin ( T &a , T b ) { if ( a > b ) a = b ; }
template < typename T > void chkmax ( T &a , T b ) { if ( a < b ) a = b ; }
void add ( int &a , int b )
{
a += b ;
if ( a >= mod ) a -= mod ;
if ( a < 0 ) a += mod ;
}
void rf ()
{
#ifndef ONLINE_JUDGE
freopen("bai1.inp","r",stdin);
freopen ("bai1.out","w",stdout) ;
#endif
}
int _pow ( int a , int n )
{
if ( n == 0 ) return 1 ;
int res = _pow (a,n/2) ;
if ( n % 2 ) return 1ll*res*res%mod*a%mod ;
else return 1ll*res*res%mod ;
}
int n , m ;
pii E [maxn] ;
vi adjList [maxn] ;
int root = 1 ;
int answer [maxn] ;
bool mst [maxn] ;
int par [maxn][19] , dep [maxn] ;
int sz [maxn] , bigChild [maxn] ;
void dfs ( int u )
{
sz [u] = 1 ;
bigChild [u] = -1 ;
for ( auto v : adjList [u] )
{
if ( v != par [u][0] )
{
dep [v] = dep [u] + 1 ;
par [v][0] = u ;
for ( int i = 1 ; i <= 18 ; i ++ ) par [v][i] = par[par[v][i-1]][i-1] ;
dfs (v) ;
sz [u] += sz [v] ;
if ( bigChild [u] == -1 || sz [v] > sz [bigChild[u]] ) bigChild [u] = v ;
}
}
}
int lca ( int u , int v )
{
if ( dep [u] < dep [v] ) swap (u,v) ;
int h = dep [u] - dep [v] ;
for ( int i = 18 ; i >= 0 ; i -- ) if ( h >> i & 1 ) u = par [u][i] ;
if ( u == v ) return u ;
for ( int i = 18 ; i >= 0 ; i -- ) if ( par [u][i] != par [v][i] ) u = par [u][i] , v = par [v][i] ;
return par [u][0] ;
}
int distance ( int u , int v )
{
return dep [u] + dep [v] - 2*dep[lca(u,v)] ;
}
int head [maxn] , num_head = 1 , pos [maxn] , Id [maxn] ;
void hld ( int u )
{
static int cnt = 0 ;
if ( head [num_head] == 0 ) head [num_head] = u ;
Id [u] = num_head ;
pos [u] = ++ cnt ;
if ( bigChild [u] != -1 ) hld (bigChild [u]) ;
for ( auto v : adjList [u] )
{
if ( v != par [u][0] && v != bigChild [u] ) num_head ++ , hld (v) ;
}
}
struct shape {
int fill , Min , lazy , flag ;
} T [maxn*4] ;
void down ( int id , int l , int r , int mid )
{
chkmin (T[left].Min,T[id].lazy) ;
chkmin (T[right].Min,T[id].lazy) ;
chkmin (T[left].lazy,T[id].lazy) ;
chkmin (T[right].lazy,T[id].lazy) ;
if ( T [id].flag )
{
T [left].fill = mid-l+1 ;
T [right].fill = r-mid ;
T [left].flag = true , T [right].flag = true ;
}
T [id].flag = false ;
T [id].lazy = INF ;
}
void update ( int id , int l , int r , int u , int v , int w )
{
if ( l > v || r < u ) return ;
if ( u <= l && r <= v )
{
chkmin (T[id].Min,w) ;
chkmin (T[id].lazy,w) ;
T [id].fill = r-l+1 ;
T [id].flag = 1 ;
return ;
}
int mid = (l+r)/2 ;
down (id,l,r,mid) ;
update (left,l,mid,u,v,w) ;
update (right,mid+1,r,u,v,w) ;
T [id].Min = min ( T[left].Min,T[right].Min) ;
T [id].fill = T [left].fill + T [right].fill ;
}
int get_min ( int id , int l , int r , int pos )
{
if ( l > pos || r < pos ) return INF ;
if ( l == r ) return T [id].Min ;
int mid = (l+r)/2 ;
down (id,l,r,mid) ;
return min(get_min(left,l,mid,pos),get_min(right,mid+1,r,pos)) ;
}
void update ( int u , int v , int w )
{
vi all_value = {u,v} ;
int Lca = lca (u,v) ;
for ( auto x : all_value )
{
while ( head [Id[x]] != head [Id[Lca]] )
{
update (1,1,n,pos[head[Id[x]]],pos[x],w) ;
x = par [head[Id[x]]][0] ;
}
if ( x != Lca ) update (1,1,n,pos[Lca]+1,pos[x],w) ;
}
}
int get_fill ( int id , int l , int r , int u , int v )
{
if ( l > v || r < u ) return 0 ;
if ( u <= l && r <= v ) return T [id].fill ;
int mid = (l+r)/2 ;
down (id,l,r,mid) ;
return get_fill (left,l,mid,u,v) + get_fill (right,mid+1,r,u,v) ;
}
int get_fill ( int u , int v )
{
int sum = 0 ;
vi all_value = {u,v} ;
int Lca = lca (u,v) ;
for ( auto x : all_value )
{
while ( head [Id[x]] != head [Id[Lca]] )
{
sum += get_fill (1,1,n,pos[head[Id[x]]],pos[x]) ;
x = par [head[Id[x]]][0] ;
}
if ( x != Lca ) sum += get_fill (1,1,n,pos[Lca]+1,pos[x]) ;
}
return sum ;
}
int main ()
{
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// rf () ;
cin >> n >> m ;
for ( int i = 1 ; i <= m ; i ++ )
{
int u , v ; cin >> u >> v ;
E [i] = {u,v} ;
}
for ( int i = 1 ; i < n ; i ++ )
{
int x ; cin >> x ;
mst [x] = true ;
int u = E [x].fi , v = E[x].se ;
adjList [u] . pb (v) ;
adjList [v] . pb (u) ;
}
dfs (1) ;
hld (1) ;
int current = 0 ;
set <int> remain_value ;
for ( int i = 1 ; i <= m ; i ++ ) remain_value . insert (i) ;
for ( int i = 1 ; i <= n*4 ; i ++ ) T [i].Min = T [i].lazy = INF ;
for ( int i = 1 ; i <= m ; i ++ )
{
int u = E[i].fi , v = E [i].se ;
if ( dep [u] > dep [v] ) swap (u,v) ;
if ( mst [i] == false )
{
answer [i] = current + distance (u,v) - get_fill (u,v) + 1 ;
update (u,v,current+1) ;
}
else
{
if ( get_min (1,1,n,pos[v] ) >= INF ) answer [i] = current + 1 , update (1,1,n,pos[v],pos[v],INF);
else answer [i] = *remain_value.lower_bound((get_min(1,1,n,pos[v]))) ;
}
chkmax (current,answer[i]) ;
remain_value.erase(answer[i]) ;
}
for ( int i = 1 ; i <= m ; i ++ ) cout << answer [i] << " " ;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
riggedroads.cpp: In function 'void rf()':
riggedroads.cpp:34:8: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
34 | freopen("bai1.inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
riggedroads.cpp:35:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
35 | freopen ("bai1.out","w",stdout) ;
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |