voidsolve( ){ string s; cin >> s; int n = s.length( ); ll len = 1, ans = 0; for( int i = 1; i < n; i ++ ) { if( s[i] != s[i-1] ) { len ++; } else { ans = ( ans + len * (len + 1) / 2 ) % mod; len = 1; } } ans = ( ans + len * (len + 1) / 2 ) % mod; cout << ans << '\n'; }
vector< int > adj[maxn]; string s[maxn]; // 0 not visited | 1 visiting | 2 visited // 我这里没开二维数组,用一维压缩了状态 (u, d) -> u * w + d int vis[maxn * 10]; int n, m, w;
booldfs( int uid ){ vis[uid] = 1;
// 解码出一维状态里对应的 u, d int u = uid / w; int d = uid % w; int nxt = (d + 1) % w;
// 停留原地 if( s[u][nxt] == 'o' ) { int vid = u * w + nxt; if( vis[vid] == 1 ) return1; if( vis[vid] == 0 ) if( dfs( vid ) ) return1; }
// 去相邻城市 for( int v : adj[u] ) { if( s[v][nxt] == 'o' ) { int vid = v * w + nxt; if( vis[vid] == 1 ) return1; if( vis[vid] == 0 ) if( dfs( vid ) ) return1; } } vis[uid] = 2; return0; }
voidsolve( ){ cin >> n >> m;
for( int i = 0; i < n; ++ i ) adj[i].clear( );
for( int i = 0; i < m; ++ i ) { int u, v; cin >> u >> v; // 使用 0-index 是为了方便后续压缩成一维状态时的除法和取模运算 u --, v --; adj[u].push_back( v ); adj[v].push_back( u ); }
cin >> w; for( int i = 0; i < n; ++ i ) cin >> s[i];
int tot = n * w; fill( vis, vis + tot, 0 );
for( int i = 0; i < n; ++ i ) { // 从每个第一天就放假的城市出发 if( s[i][0] == 'o' ) { int stid = i * w + 0; if( vis[stid] == 0 ) { if( dfs( stid ) ) { cout << "Yes" << '\n'; return; } } } } cout << "No" << '\n'; return; }
voidsolve( ){ cin >> n >> k; for( int i = 1; i <= n; ++ i ) cin >> a[i]; ll ans = inf;
for( int l = 1; l <= n - k + 1; ++ l ) { // k days ll dp0 = inf, dp1 = a[l]; for( int i = l + 1; i <= l + k - 1; ++ i ) { ll nxtdp0 = dp1; ll nxtdp1 = min( dp0, dp1 ) + a[i]; dp0 = nxtdp0; dp1 = nxtdp1; } ans = min( ans, dp1 );
// k + 1 days if( l + k <= n ) { int i = l + k; ll nxtdp0 = dp1; ll nxtdp1 = min( dp0, dp1 ) + a[i]; dp0 = nxtdp0; dp1 = nxtdp1; } ans = min( ans, dp1 ); }
Mat merge( const Mat &a, const Mat &b ){ Mat res; for( int i = 0; i < 2; ++ i ) { for( int j = 0; j < 2; ++ j ) for( int k = 0; k < 2; ++ k ) { if( a.m[i][k] == inf || b.m[k][j] == inf ) continue; res.m[i][j] = min( res.m[i][j], a.m[i][k] + b.m[k][j] ); } } return res; }
#define ls u << 1 #define rs u << 1 | 1
voidbuild( int u, int l, int r ){ if( l == r ) { tr[u].m[0][0] = inf; tr[u].m[0][1] = 0; tr[u].m[1][0] = a[l]; tr[u].m[1][1] = a[l]; return; } int mid = ( l + r ) >> 1; build( ls, l, mid ); build( rs, mid + 1, r ); tr[u] = merge( tr[ls], tr[rs] ); }
Mat query( int u, int l, int r, int ql, int qr ){ if( ql <= l && r <= qr ) return tr[u]; int mid = ( l + r ) >> 1; if( qr <= mid ) returnquery( ls, l, mid, ql, qr ); if( ql > mid ) returnquery( rs, mid + 1, r, ql, qr ); returnmerge( query( ls, l, mid, ql, qr ), query( rs, mid + 1, r, ql, qr ) ); }
voidsolve( ){ cin >> n >> k; for( int i = 1; i <= n; ++ i ) cin >> a[i];
build( 1, 1, n ); ll ans = inf;
int len = k; for( int l = 1; l <= n - len + 1; ++ l ) { int r = l + len - 1; if( r == l ) { ans = min( ans, a[l] ); continue; } if( r - l <= 1 ) { ans = min( ans, a[l] + a[r] ); continue; } Mat T = query( 1, 1, n, l + 1, r - 1 ); ll res = min( T.m[1][1], T.m[0][1] ) + a[l] + a[r]; ans = min( ans, res ); }
len = k + 1; for( int l = 1; l <= n - len + 1; ++ l ) { int r = l + len - 1; if( r == l ) { ans = min( ans, a[l] ); continue; } if( r - l <= 1 ) { ans = min( ans, a[l] + a[r] ); continue; } Mat T = query( 1, 1, n, l + 1, r - 1 ); ll res = min( T.m[1][1], T.m[0][1] ) + a[l] + a[r]; ans = min( ans, res ); }