Submission #1227982

#TimeUsernameProblemLanguageResultExecution timeMemory
1227982thunoproRigged Roads (NOI19_riggedroads)C++20
27 / 100
405 ms82388 KiB
#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[x],pos[head[Id[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[x],pos[head[Id[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; }

Compilation message (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 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...