【HDU】5796 Magic Number【lca】
来源:互联网 发布:手机用数据会出400bad 编辑:程序博客网 时间:2024/05/02 05:02
题目链接:Magic Number
看懂题目,就知道怎么做
#include <stdio.h>#include <vector>#include <string.h>#include <algorithm>using namespace std ;typedef long long LL ;typedef pair < int , int > pii ;#define clr( a , x ) memset ( a , x , sizeof a )const int MAXN = 5005 ;const int N = 1000005 ;int n , m , q ;int a[MAXN] , b[MAXN] , c[N] ;int f[MAXN][15] , dep[MAXN] ;int dfn[MAXN] , dfs_time ;vector < int > G[MAXN] ;int lca ( int x , int y ) { if ( dep[x] < dep[y] ) swap ( x , y ) ; for ( int i = 14 ; ~i ; -- i ) { if ( dep[x] - ( 1 << i ) >= dep[y] ) x = f[x][i] ; } if ( x == y ) return x ; for ( int i = 14 ; ~i ; -- i ) { if ( ~f[x][i] && ~f[y][i] && f[x][i] != f[y][i] ) { x = f[x][i] ; y = f[y][i] ; } } return f[x][0] ;}void dfs ( int u ) { dfn[u] = ++ dfs_time ; for ( int i = 0 ; i < G[u].size () ; ++ i ) { dfs ( G[u][i] ) ; }}int cmp ( const int& a , const int& b ) { return dfn[a] < dfn[b] ;}void scanf ( int& x , char c = 0 ) { while ( ( c = getchar () ) < '0' ) ; x = c - '0' ; while ( ( c = getchar () ) >= '0' ) x = x * 10 + c - '0' ;}void solve () { clr ( f , -1 ) ; dfs_time = 0 ; scanf ( "%d%d" , &n , &m ) ; for ( int i = 1 ; i <= n ; ++ i ) { G[i].clear () ; } for ( int i = 1 ; i <= m ; ++ i ) { scanf ( a[i] ) ; a[i] ++ ; } sort ( a + 1 , a + m + 1 ) ; int j = 1 ; for ( int i = 1 ; i <= n ; ++ i ) { int x = -1 , l = i * ( i - 1 ) / 2 + 1 , r = i * ( i + 1 ) / 2 ; while ( j <= m && a[j] <= r ) { int t = a[j ++] - l + 1 ; if ( t >= i ) continue ; if ( x == -1 ) x = t ; else x = lca ( x , t ) ; } if ( x == -1 ) x = 0 ; dep[i] = dep[x] + 1 ; f[i][0] = x ; G[x].push_back ( i ) ; for ( int j = 1 ; j < 15 ; ++ j ) { if ( ~f[i][j - 1] ) f[i][j] = f[f[i][j - 1]][j - 1] ; } } dfs ( 0 ) ; scanf ( "%d%d" , &q , &m ) ; for ( int i = 1 ; i <= q ; ++ i ) { scanf ( b[i] ) ; } for ( int i = 1 ; i <= m ; ++ i ) { scanf ( c[i] ) ; c[i] ++ ; } sort ( c + 1 , c + m + 1 ) ; int tot = 0 ; j = 1 ; for ( int i = 1 ; i <= q ; ++ i ) { int l = tot + 1 , r = tot + b[i] , n1 = 0 ; while ( j <= m && c[j] <= r ) { int t = c[j ++] - l + 1 ; if ( t <= n ) a[n1 ++] = t ; } sort ( a , a + n1 , cmp ) ; int ans = 0 ; for ( int j = 0 ; j < n1 ; ++ j ) { ans += dep[a[j]] ; if ( j ) ans -= dep[lca ( a[j - 1] , a[j] )] ; } printf ( "%d\n" , ans ) ; tot += b[i] ; }}int main () { int T ; scanf ( "%d" , &T ) ; for ( int i = 1 ; i <= T ; ++ i ) { printf ( "Case #%d:\n" , i ) ; solve () ; } return 0 ;}
0 0
- 【HDU】5796 Magic Number【lca】
- hdu 4323 Magic Number
- Hdu 4323 Magic Number
- HDU-4323Magic Number
- hdu 4323 Magic Number( DP )
- Magic Number LCA求路径点集的并
- hdu - 4323 - Magic Number - dp + 数据结构优化
- hdu 4323 Magic Number(编辑距离)
- hdu 4323 Magic Number (dp,编辑距离)
- HDU 4323 Magic Number(DP)
- HDU 4323 Magic Number 编辑距离
- hdu 4323 Magic Number 编辑距离
- magic number
- magic number
- Magic number
- magic number
- HDU 4323 Magic Number 编辑距离(经典DP)
- HDU 4323 Magic Number(编辑距离 DP)
- Android仿外卖购物车的实现
- LeetCode Insert Delete GetRandom O(1)
- c语言中的rand函数
- 软件测试的非业务功能关注点
- OkHttp源码解析(二)——整体流程(下)
- 【HDU】5796 Magic Number【lca】
- 三种无线传输技术在物联网应用的比较
- OkHttp源码解析(三)——连接池复用
- 实战1 walker登录页面的实现
- hdu 5916 Harmonic Value Description
- OkHttp源码解析(四)——失败重连
- 会场安排问题核心思想与代码实现
- 试试水
- Android 粒子效果