1 条题解
-
0
#include<bits/stdc++.h> typedef long long LL; const int INF = 0x3f3f3f3f; const int MAXN = 4e5 + 5, MAXLOG = 25;
template void read( _T &x ) { x = 0; char s = getchar(); bool f = false; while( s < '0' || '9' < s ) { f = s == '-', s = getchar(); } while( '0' <= s && s <= '9' ) { x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar(); } if( f ) x = -x; }
template void write( _T x ) { if( x < 0 ) putchar( '-' ), x = -x; if( 9 < x ) write( x / 10 ); putchar( x % 10 + '0' ); }
template _T MIN( const _T a, const _T b ) { return a < b ? a : b; }
template _T MAX( const _T a, const _T b ) { return a > b ? a : b; }
LL gain[MAXN][MAXLOG]; int go[MAXN][MAXLOG];
LL jmp[MAXN][MAXLOG]; int nxt[MAXN][MAXLOG], lim[MAXN][MAXLOG];
LL wei[MAXN][MAXLOG]; int bound[MAXN][MAXLOG], tar[MAXN][MAXLOG]; bool vis[MAXN];
int S[MAXN], P[MAXN], W[MAXN], L[MAXN];
int up, dn; int N, Q, lg2, fin;
void DFS( const int u, const int t ) { if( ~ tar[u][t] || vis[u] ) return ; vis[u] = true; if( S[u] < ( 1 << t ) ) { DFS( W[u], t ); tar[u][t] = tar[W[u]][t]; wei[u][t] = wei[W[u]][t] + S[u]; bound[u][t] = MAX( 0, MIN( up - 1, bound[W[u]][t] ) - S[u] ); } else { DFS( L[u], t ); tar[u][t] = tar[L[u]][t]; wei[u][t] = wei[L[u]][t] + P[u]; bound[u][t] = MAX( 0, MIN( S[u] - 1, MIN( up - 1, bound[L[u]][t] ) - P[u] ) ); } }
void Init() { int mx = 0; for( int i = 0 ; i < N ; i ++ ) mx = MAX( mx, S[i] ); lg2 = log2( mx ), fin = log2( N ); for( int t = 0 ; t <= lg2 ; t ++ ) { up = ( 1 << ( t + 1 ) ), dn = 1 << t; for( int i = 0 ; i <= N ; i ++ ) tar[i][t] = -1, bound[i][t] = 0, vis[i] = false; for( int i = 0 ; i <= N ; i ++ ) if( i == N || ( dn <= S[i] && S[i] < up ) ) tar[i][t] = i, wei[i][t] = 0, bound[i][t] = INF; for( int i = 0 ; i <= N ; i ++ ) DFS( i, t ); for( int i = 0 ; i < N ; i ++ ) if( dn <= S[i] && S[i] < up ) { if( ~ tar[L[i]][t] ) { nxt[i][0] = tar[L[i]][t]; jmp[i][0] = P[i] + wei[L[i]][t]; lim[i][0] = MAX( 0, MIN( MIN( up - 1 - P[i], S[i] - 1 ), bound[L[i]][t] - P[i] ) ); } else nxt[i][0] = -1, jmp[i][0] = 0, lim[i][0] = 0; } } nxt[N][0] = N, lim[N][0] = 0; for( int j = 1 ; j <= lg2 ; j ++ ) for( int i = 0 ; i <= N ; i ++ ) { int p = nxt[i][j - 1]; if( p == -1 || nxt[p][j - 1] == -1 ) { nxt[i][j] = -1; jmp[i][j] = lim[i][j] = 0; continue; } nxt[i][j] = nxt[p][j - 1]; jmp[i][j] = jmp[i][j - 1] + jmp[p][j - 1]; lim[i][j] = MAX( 0ll, MIN( ( LL ) lim[i][j - 1], lim[p][j - 1] - jmp[i][j - 1] ) ); }
gain[N][0] = 0, go[N][0] = N; for( int i = 0 ; i < N ; i ++ ) gain[i][0] = S[i], go[i][0] = W[i]; for( int j = 1 ; j <= fin ; j ++ ) for( int i = 0 ; i <= N ; i ++ ) go[i][j] = go[go[i][j - 1]][j - 1], gain[i][j] = gain[i][j - 1] + gain[go[i][j - 1]][j - 1];
}
LL Query( int x, LL z ) { for( int t = 0 ; t <= lg2 ; t ++ ) { if( z >= ( 1 << ( t + 1 ) ) ) continue; if( z > bound[x][t] || tar[x][t] == -1 ) continue; z += wei[x][t], x = tar[x][t]; for( int i = lg2 ; ~ i ; i -- ) if( ~ nxt[x][i] && z <= lim[x][i] ) z += jmp[x][i], x = nxt[x][i]; if( x == N ) break; if( z < S[x] ) z += P[x], x = L[x]; else z += S[x], x = W[x]; } if( x != N ) { for( int i = fin ; ~ i ; i -- ) if( go[x][i] != N ) z += gain[x][i], x = go[x][i]; z += S[x]; } return z; }
int main() { read( N ), read( Q ); for( int i = 0 ; i < N ; i ++ ) read( S[i] ); for( int i = 0 ; i < N ; i ++ ) read( P[i] ); for( int i = 0 ; i < N ; i ++ ) read( W[i] ); for( int i = 0 ; i < N ; i ++ ) read( L[i] ); Init(); while( Q -- ) { int a, b; read( a ), read( b ); write( Query( a, b ) ), putchar( '\n' ); } return 0; }
信息
- ID
- 21065
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 3
- 已通过
- 0
- 上传者