A - Cow and Haybales
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ( ) {
ll t;
cin>> t;
ll n, d;
while ( t-- ) {
cin>> n>> d;
ll x;
cin>> x;
ll ans= x;
for ( ll i= 1 ; i< n; i++ ) {
cin>> x;
ans+ = min ( d/ i, x) ;
d- = min ( d/ i, x) * i;
}
cout<< ans<< endl;
}
}
B - Cow and Friend
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn= 1e5 ;
ll a[ maxn+ 10 ] ;
int main ( ) {
ll t;
cin>> t;
while ( t-- ) {
ll n, x;
cin>> n>> x;
ll ans= 0 ;
for ( ll i= 1 ; i<= n; i++ ) {
scanf ( "%lld" , & a[ i] ) ;
if ( a[ i] == x)
ans= 1 ;
}
if ( ! ans) {
sort ( a+ 1 , a+ 1 + n) ;
if ( a[ n] >= x)
ans= 2 ;
else {
ans= ( x+ a[ n] - 1 ) / a[ n] ;
}
}
cout<< ans<< endl;
}
}
C - Cow and Message
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn= 1e5 + 10 ;
map< pair< ll, ll> , ll> mp1;
map< char , ll> mp2;
ll sum[ 26 ] [ maxn] ;
int main ( ) {
string s;
cin>> s;
for ( ll i= 0 ; i< s. size ( ) ; i++ ) {
mp2[ s[ i] ] ++ ;
}
ll ans= 0 ;
for ( auto it: mp2) {
ans= max ( ans, it. second) ;
}
for ( ll i= s. size ( ) - 1 ; i>= 0 ; i-- ) {
for ( ll j= 0 ; j< 26 ; j++ ) {
sum[ j] [ i] = sum[ j] [ i+ 1 ] ;
}
sum[ s[ i] - 'a' ] [ i] ++ ;
}
for ( ll i= 0 ; i< s. size ( ) ; i++ ) {
for ( ll j= 0 ; j< 26 ; j++ ) {
mp1[ { s[ i] - 'a' , j} ] + = sum[ j] [ i+ 1 ] ;
}
}
for ( auto it: mp1) {
ans= max ( ans, it. second) ;
}
cout<< ans<< endl;
}
D - Cow and Fields
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn= 2e5 + 10 ;
ll head[ maxn] ;
ll dis[ 2 ] [ maxn] ;
ll a[ maxn] ;
bool vis[ maxn] ;
struct edge{
ll v, next;
} e[ maxn<< 1 ] ;
ll cnt= 0 ;
void add ( ll u, ll v) {
e[ cnt] . next= head[ u] ;
e[ cnt] . v= v;
head[ u] = cnt++ ;
}
void bfs ( ll s, ll op) {
memset ( vis, false , sizeof ( vis) ) ;
vis[ s] = true ;
dis[ op] [ s] = 0 ;
queue< ll> q;
q. push ( s) ;
while ( ! q. empty ( ) ) {
ll u= q. front ( ) ;
q. pop ( ) ;
for ( ll i= head[ u] ; ~ i; i= e[ i] . next) {
ll v= e[ i] . v;
if ( vis[ v] )
continue ;
vis[ v] = true ;
dis[ op] [ v] = dis[ op] [ u] + 1 ;
q. push ( v) ;
}
}
}
int main ( ) {
memset ( head, - 1 , sizeof ( head) ) ;
ll n, m, k;
cin>> n>> m>> k;
for ( ll i= 1 ; i<= k; i++ ) {
scanf ( "%lld" , & a[ i] ) ;
}
for ( ll i= 1 ; i<= m; i++ ) {
ll u, v;
scanf ( "%lld%lld" , & u, & v) ;
add ( u, v) ;
add ( v, u) ;
}
bfs ( 1 , 0 ) ;
bfs ( n, 1 ) ;
vector< pair< ll, ll>> vec;
for ( int i= 1 ; i<= k; i++ ) {
vec. push_back ( { dis[ 0 ] [ a[ i] ] - dis[ 1 ] [ a[ i] ] , a[ i] } ) ;
}
sort ( vec. begin ( ) , vec. end ( ) ) ;
ll tmp= 0 ;
ll ans= 0 ;
for ( int i= 0 ; i< vec. size ( ) ; i++ ) {
if ( i)
ans= max ( ans, tmp+ dis[ 1 ] [ vec[ i] . second] + 1 ) ;
tmp= max ( tmp, dis[ 0 ] [ vec[ i] . second] ) ;
}
cout<< min ( ans, dis[ 0 ] [ n] ) << endl;
}