Skip to content

Instantly share code, notes, and snippets.

@IvanIsCoding
Last active October 21, 2023 09:07
Show Gist options
  • Select an option

  • Save IvanIsCoding/a1fe3bfb85210642d47cf48b292dd725 to your computer and use it in GitHub Desktop.

Select an option

Save IvanIsCoding/a1fe3bfb85210642d47cf48b292dd725 to your computer and use it in GitHub Desktop.
Educational Dynamic Programming Contest - AtCoder
// Ivan Carvalho
// Problem A - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int INF = 2*1e9;
int dp[MAXN],N,K,h[MAXN];
int main(){
scanf("%d",&N);
K = 2;
for(int i = 1;i<=N;i++){
scanf("%d",&h[i]);
}
for(int i = 2;i<=N;i++){
dp[i] = INF;
for(int j = i-1;j>=max(i - K,1);j--){
dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]) );
}
}
printf("%d\n",dp[N]);
return 0;
}
// Ivan Carvalho
// Problem B - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int INF = 2*1e9;
int dp[MAXN],N,K,h[MAXN];
int main(){
scanf("%d %d",&N,&K);
for(int i = 1;i<=N;i++){
scanf("%d",&h[i]);
}
for(int i = 2;i<=N;i++){
dp[i] = INF;
for(int j = i-1;j>=max(i - K,1);j--){
dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]) );
}
}
printf("%d\n",dp[N]);
return 0;
}
// Ivan Carvalho
// Problem C - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int vis[MAXN][3],dp[MAXN][3],N,A[3][MAXN];
int solve(int pos,int last){
if(pos == N + 1) return 0;
if(vis[pos][last]) return dp[pos][last];
vis[pos][last] = 1;
int best = 0;
for(int i = 0;i<3;i++){
if(i != last) best = max(best, A[i][pos] + solve(pos+1,i) );
}
return dp[pos][last] = best;
}
int main(){
scanf("%d",&N);
for(int i = 1;i<=N;i++){
scanf("%d %d %d",&A[0][i],&A[1][i],&A[2][i]);
}
printf("%d\n", max(solve(1,0), max(solve(1,1),solve(1,2)) ) );
return 0;
}
// Ivan Carvalho
// Problem D - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXW = 1e5 + 10;
long long knapsack[MAXW];
int N,W;
int main(){
cin >> N >> W;
for(int item = 1;item<=N;item++){
int w,v;
cin >> w >> v;
for(int i = W;i>=w;i--) knapsack[i] = max(knapsack[i-w] + v,knapsack[i]);
}
long long best = 0;
for(int i = 0;i<=W;i++) best = max(best,knapsack[i]);
cout << best << endl;
return 0;
}
// Ivan Carvalho
// Problem E - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXV = 1e5 + 10;
const int MAXN = 1e3 + 10;
const ll INF = 1e13;
ll dp[MAXV];
int N,W,V,wi[MAXN],vi[MAXN];
int main(){
cin >> N >> W;
for(int i = 1;i<=N;i++){
cin >> wi[i] >> vi[i];
V += vi[i];
}
for(int i = 1;i<=V;i++) dp[i] = INF;
dp[0] = 0;
for(int item = 1;item<=N;item++){
int w = wi[item], v = vi[item];
for(int i = V;i>=v;i--){
dp[i] = min(dp[i],dp[i - v] + w);
}
}
for(int i = V;i>=0;i--){
if(dp[i] <= W){
cout << i << endl;
break;
}
}
return 0;
}
// Ivan Carvalho
// Problem F - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3010;
string s,t;
int dp[MAXN][MAXN],N,M;
stack<char> resposta;
int solve(int a,int b){
if(a < 0 || b < 0) return 0;
if(dp[a][b] != -1) return dp[a][b];
if(s[a] == t[b]) return dp[a][b] = 1 + solve(a-1,b-1);
return dp[a][b] = max(solve(a-1,b),solve(a,b-1));
}
void build(int a,int b){
if(a < 0 || b < 0) return;
if(s[a] == t[b]){
resposta.push(s[a]);
build(a-1,b-1);
return;
}
if(solve(a-1,b) > solve(a,b-1)) build(a-1,b);
else build(a,b-1);
}
int main(){
memset(dp,-1,sizeof(dp));
cin >> s;
cin >> t;
N = (int)s.size();
M = (int)t.size();
build(N-1,M-1);
while(!resposta.empty()){
cout << resposta.top();
resposta.pop();
}
cout << endl;
return 0;
}
// Ivan Carvalho
// Problem G - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
vector<int> grafo[MAXN];
int dp[MAXN],vis[MAXN],N,M;
int solve(int v){
if(vis[v]) return dp[v];
vis[v] = 1;
int best = 0;
for(int u : grafo[v]){
best = max(best, solve(u) + 1 );
}
return dp[v] = best;
}
int main(){
scanf("%d %d",&N,&M);
for(int i = 1;i<=M;i++){
int u,v;
scanf("%d %d",&u,&v);
grafo[u].push_back(v);
}
int best = 0;
for(int i = 1;i<=N;i++) best = max(best, solve(i) );
printf("%d\n",best);
return 0;
}
// Ivan Carvalho
// Problem H - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1010;
const int MOD = 1e9 + 7;
char entrada[MAXN][MAXN];
int dp[MAXN][MAXN],vis[MAXN][MAXN];
int N,M;
int solve(int x,int y){
if(x >= N || y >= M) return 0;
if(entrada[x][y] == '#') return 0;
if(vis[x][y]) return dp[x][y];
if(x == N - 1 && y == M - 1) return dp[x][y] = 1;
vis[x][y] = 1;
return dp[x][y] = (solve(x+1,y) + solve(x,y+1)) % MOD;
}
int main(){
scanf("%d %d",&N,&M);
for(int i = 0;i<N;i++){
scanf("%s",entrada[i]);
}
printf("%d\n",solve(0,0));
return 0;
}
// Ivan Carvalho
// Problem I - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3002;
double dp[MAXN][MAXN],P[MAXN];
int vis[MAXN][MAXN],N;
double solve(int pos,int heads){
if(heads < 0) return 0.0;
if(pos == 0){
return (heads == 0);
}
if(vis[pos][heads]) return dp[pos][heads];
vis[pos][heads] = 1;
return dp[pos][heads] = (P[pos])*solve(pos-1,heads-1) + (1.0 - P[pos])*solve(pos-1,heads);
}
int main(){
cin >> N;
for(int i = 1;i<=N;i++){
cin >> P[i];
}
double tot = 0;
for(int heads = 0;heads<=N;heads++){
int tails = N - heads;
if(heads > tails) tot += solve(N,heads);
}
printf("%.9lf\n",tot);
return 0;
}
// Ivan Carvalho
// Problem J - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 302;
double dp[MAXN][MAXN][MAXN];
int N,vis[MAXN][MAXN][MAXN];
double solve(int x,int y,int z){
if(vis[x][y][z]) return dp[x][y][z];
//printf("Solving %d %d %d\n",x,y,z);
vis[x][y][z] = 1;
if(x == 0 && y == 0 && z == 0) return dp[x][y][z] = 0;
int soma = x + y + z;
double convertido = (double)soma;
double tot = (N - soma)/convertido;
//printf("Tot antes %d %d %d %d %lf\n",N - soma,x,y,z,tot);
if(x != 0) tot += x*((solve(x-1,y,z) + 1)/convertido);
if(y != 0) tot += y*((solve(x+1,y-1,z) + 1)/convertido);
if(z != 0) tot += z*((solve(x,y+1,z-1) + 1)/convertido);
//printf("Tot (%d,%d,%d) = %lf\n",x,y,z,tot);
return dp[x][y][z] = tot;
}
int main(){
int a[4] = {0,0,0,0};
cin >> N;
for(int i = 1;i<=N;i++){
int x;
cin >> x;
a[x]++;
}
printf("%.9lf\n",solve(a[1],a[2],a[3]));
return 0;
}
// Ivan Carvalho
// Problem K - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXK = 1e5 + 10;
const int MAXN = 1e3 + 10;
int A[MAXN],dp[MAXK],N,K;
int solve(int k){
if(dp[k] != -1) return dp[k];
if(k == 0) return dp[k] = 0;
int ans = 0;
for(int i = 1;i<=N;i++){
if(A[i] > k) continue;
if(solve(k - A[i]) == 0){
ans = 1;
break;
}
}
return dp[k] = ans;
}
int main(){
memset(dp,-1,sizeof(dp));
cin >> N >> K;
for(int i = 1;i<=N;i++){
cin >> A[i];
}
if(solve(K)) printf("First\n");
else printf("Second\n");
return 0;
}
// Ivan Carvalho
// Problem L - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 3002;
ll dp[MAXN][MAXN];
bool vis[MAXN][MAXN];
int A[MAXN],N;
ll solve(int i,int j){
if(vis[i][j]) return dp[i][j];
vis[i][j] = 1;
if(i == j) return dp[i][j] = A[i];
return dp[i][j] = max(A[i] - solve(i+1,j), A[j] - solve(i,j-1));
}
int main(){
cin >> N;
for(int i = 1;i<=N;i++){
cin >> A[i];
}
cout << solve(1,N) << endl;
return 0;
}
// Ivan Carvalho
// Problem M - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXK = 1e5 + 10;
const int MOD = 1e9 + 7;
int pref[MAXK],dp[MAXK],N,K;
int calc(int a,int b){
if(a < 0) a = 0;
int ans = pref[b];
if(a != 0) ans -= pref[a-1];
return ans % MOD;
}
int main(){
cin >> N >> K;
dp[0] = 1;
for(int kid = 1;kid<=N;kid++){
int c;
cin >> c;
pref[0] = dp[0];
dp[0] = 0;
for(int i = 1;i<=K;i++){
pref[i] = (pref[i-1] + dp[i]) % MOD;
}
for(int i = 0;i<=K;i++){
dp[i] = calc(i-c,i);
}
}
int ans = dp[K];
if(ans < 0) ans += MOD;
printf("%d\n",ans);
return 0;
}
// Ivan Carvalho
// Problem N - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 410;
const ll INF = 1e14;
ll dp[MAXN][MAXN],V[MAXN],pref[MAXN];
int N;
ll calc(ll a,ll b){
if(a > b) return INF;
return pref[b] - pref[a-1];
}
ll solve(int ini,int fim){
if(dp[ini][fim] != -1) return dp[ini][fim];
if(ini == fim) return dp[ini][fim] = 0;
if(ini + 1 == fim) return dp[ini][fim] = V[ini] + V[fim];
ll best = INF;
for(int i = ini;i<fim;i++){
ll cand = solve(ini,i) + solve(i+1,fim) + calc(ini,fim);
best = min(best,cand);
}
return dp[ini][fim] = best;
}
int main(){
memset(dp,-1,sizeof(dp));
cin >> N;
for(int i = 1;i<=N;i++) cin >> V[i];
for(int i = 1;i<=N;i++) pref[i] = pref[i-1] + V[i];
cout << solve(1,N) << endl;
return 0;
}
// Ivan Carvalho
// Problem O - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 21;
const int MAXL = (1 << 21 ) + 2;
const int MOD = 1e9 + 7;
int dp[MAXN][MAXL],mascara[MAXN],N;
int solve(int pos,int bitmask){
if(pos == N) return (__builtin_popcount(bitmask) == N);
if(dp[pos][bitmask] != -1) return dp[pos][bitmask];
int tot = 0;
for(int i = 0;i<N;i++){
if(!(bitmask & (1 << i)) && ((1 << i) & mascara[pos])){
tot = (tot + solve(pos+1, bitmask | (1 << i) )) % MOD;
}
}
return dp[pos][bitmask] = tot;
}
int main(){
memset(dp,-1,sizeof(dp));
cin >> N;
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
int x;
cin >> x;
if(x) mascara[i] |= (1 << j);
}
}
cout << solve(0,0) << endl;
return 0;
}
// Ivan Carvalho
// Problem P - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;
vector<int> grafo[MAXN];
ll dp[MAXN][2];
int N;
ll solve(int v,int c,int p){
if(dp[v][c] != -1) return dp[v][c];
ll tot = 1;
for(int u : grafo[v]){
if(u == p) continue;
if(c == 0) tot = (tot * (solve(u,0,v) + solve(u,1,v))) % MOD;
else tot = (tot * solve(u,0,v)) % MOD;
}
return dp[v][c] = tot;
}
int main(){
memset(dp,-1,sizeof(dp));
scanf("%d",&N);
for(int i = 1;i<N;i++){
int u,v;
scanf("%d %d",&u,&v);
grafo[u].push_back(v);
grafo[v].push_back(u);
}
printf("%lld\n", (solve(1,0,-1) + solve(1,1,-1)) % MOD );
return 0;
}
// Ivan Carvalho
// Problem Q - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
#define LSOne(S) ((S) & (-S))
using namespace std;
typedef long long ll;
const int MAXN = 2*1e5 + 10;
ll bit[MAXN],dp[MAXN];
ll h[MAXN],a[MAXN];
int N;
void update(int x, ll val){
while(x <= N){
bit[x] = max(bit[x],val);
x += LSOne(x);
}
}
ll query(int x){
ll ans = 0;
while(x > 0){
ans = max(ans,bit[x]);
x -= LSOne(x);
}
return ans;
}
int main(){
scanf("%d",&N);
for(int i = 1;i<=N;i++){
scanf("%lld",&h[i]);
}
for(int i = 1;i<=N;i++){
scanf("%lld",&a[i]);
}
for(int i = 1;i<=N;i++){
dp[i] = query(h[i] - 1) + a[i];
update(h[i],dp[i]);
}
ll best = 0;
for(int i = 1;i<=N;i++) best = max(best,dp[i]);
printf("%lld\n",best);
return 0;
}
// Ivan Carvalho
// Problem R - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 50;
const int MOD = 1e9 + 7;
struct matrix{
ll mat[MAXN][MAXN];
matrix(int idd = 0){
for(int i = 0;i<MAXN;i++){
for(int j = 0;j<MAXN;j++){
mat[i][j] = (idd) ? (i == j) : (0);
}
}
}
matrix operator*(const matrix& other)const{
matrix ans;
for(int i = 0;i<MAXN;i++){
for(int j = 0;j<MAXN;j++){
for(int k = 0;k<MAXN;k++){
ans.mat[i][j] += mat[i][k]*other.mat[k][j];
if(ans.mat[i][j] > MOD) ans.mat[i][j] %= MOD;
}
}
}
return ans;
}
};
matrix exponentiation(matrix base, ll K){
matrix ans(1);
for(int i = 0;(1LL << i) <= K;i++){
if((1LL << i) & K) ans = ans*base;
base = base*base;
}
return ans;
}
int main(){
matrix base;
int N;
ll K;
cin >> N >> K;
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++) cin >> base.mat[i][j];
}
matrix ans = exponentiation(base,K);
ll paths = 0;
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
paths = (paths + ans.mat[i][j]) % MOD;
}
}
cout << paths << endl;
return 0;
}
// Ivan Carvalho
// Problem S - Educational Dynamic Programming Contest - AtCoder
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e4 + 10;
const int MAXD = 1e2 + 10;
const int MOD = 1e9 + 7;
vector<int> digitos;
string s;
int N,D;
ll dp[MAXN][2][MAXD];
ll solve(int pos,int flag,int resto){
if(pos == N) return (resto == 0);
if(dp[pos][flag][resto] != -1) return dp[pos][flag][resto];
ll tot = 0;
int limit = (flag) ? (digitos[pos]) : (9);
for(int i = 0;i<=limit;i++){
tot += solve(pos+1,flag && (i == limit), (resto + i) % D );
}
return dp[pos][flag][resto] = tot % MOD;
}
int main(){
cin >> s;
cin >> D;
N = (int)s.size();
for(int i = 0;i<N;i++){
digitos.push_back(s[i] - '0');
}
memset(dp,-1,sizeof(dp));
ll ans = solve(0,1,0) - 1;
if(ans < 0) ans += MOD;
cout << ans << endl;
return 0;
}
// Ivan Carvalho
// Problem T - Educational Dynamic Programming Contest - AtCoder
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 3010;
const int MOD = 1e9 + 7;
string s;
int vis[MAXN][MAXN],ok[MAXN][MAXN];
ll dp[MAXN][MAXN],somatorio[MAXN][MAXN];
int N;
ll solve(int pos, int ultimo);
ll calc(int pos,int ultimo);
ll solve(int pos,int ultimo){
if(vis[pos][ultimo]) return dp[pos][ultimo];
vis[pos][ultimo] = 1;
if(ultimo > pos + 1) return dp[pos][ultimo] = 0;
if(pos == 0) return dp[pos][ultimo] = 1;
if(s[pos-1] == '>'){
ll tot = calc(pos-1,N) - calc(pos-1,ultimo - 1);
return dp[pos][ultimo] = ((tot + MOD) % MOD);
}
else{
ll tot = calc(pos-1,ultimo-1);
return dp[pos][ultimo] = (tot % MOD);
}
}
ll calc(int pos,int ultimo){
if(ultimo == 0) return 0;
if(ok[pos][ultimo]) return somatorio[pos][ultimo];
ok[pos][ultimo] = 1;
ll tot = solve(pos,ultimo) + calc(pos,ultimo - 1);
return somatorio[pos][ultimo] = (tot % MOD);
}
int main(){
cin >> N;
cin >> s;
ll tot = 0;
for(int i = 1;i<=N;i++){
tot += solve(N-1,i);
}
tot %= MOD;
cout << tot << endl;
return 0;
}
// Ivan Carvalho
// Problem U - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 16;
const int MAXL = (1 << 16) + 10;
const ll NEG = -1e18;
vector<int> grafo[MAXL];
ll valor[MAXL],dp[MAXL],mat[MAXN][MAXN];
int vis[MAXL],N;
void brute(int pos,int bitmask,int submask){
if(pos == N){
if(__builtin_popcount(submask) == 0) return;
grafo[bitmask].push_back(submask);
return;
}
brute(pos+1,bitmask,submask);
brute(pos+1, bitmask | (1 << pos), submask );
brute(pos+1, bitmask | (1 << pos), submask | (1 << pos) );
}
void calcula(){
for(int bitmask = 1;bitmask < (1 << N);bitmask++){
for(int i = 0;i<N;i++){
if(!(bitmask & (1 << i))) continue;
for(int j = i+1;j<N;j++){
if(!(bitmask & (1 << j))) continue;
valor[bitmask] += mat[i][j];
}
}
}
}
ll solve(int bitmask){
if(bitmask == 0) return 0;
if(vis[bitmask]) return dp[bitmask];
vis[bitmask] = 1;
ll best = NEG;
for(int submask : grafo[bitmask]){
best = max(best, solve(bitmask ^ submask) + valor[submask] );
}
return dp[bitmask] = best;
}
int main(){
cin >> N;
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
cin >> mat[i][j];
}
}
brute(0,0,0);
calcula();
cout << solve((1 << N) - 1) << endl;
return 0;
}
// Ivan Carvalho
// Problem V - Educational Dynamic Programming Contest - AtCoder
// Link : https://atcoder.jp/contests/dp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
vector<int> grafo[MAXN];
ll dp[MAXN],correction[MAXN],ansP[MAXN];
int N,M;
void dfs1(int v,int p){
dp[v] = 1;
vector<int> children;
for(int u : grafo[v]){
if(u == p) continue;
dfs1(u,v);
dp[v] = (dp[v] * (1 + dp[u])) % M;
children.push_back(u);
}
vector<ll> prefV,sufV;
ll pref = 1, suf = 1;
for(int i = 0;i<(int)children.size();i++){
int u = children[i];
prefV.push_back(pref);
pref = (pref * (1 + dp[u])) % M;
}
for(int i = (int)children.size() - 1;i>=0;i--){
int u = children[i];
sufV.push_back(suf);
suf = (suf * (1 + dp[u])) % M;
}
reverse(sufV.begin(),sufV.end());
for(int i = 0;i<(int)children.size();i++){
int u = children[i];
correction[u] = (prefV[i]*sufV[i]) % M;
}
}
void dfs2(int v,int p){
ansP[v] = (dp[v] * correction[v]) % M;
for(int u : grafo[v]){
if(u == p) continue;
correction[u] = (correction[u] * (correction[v]) + 1) % M;
dfs2(u,v);
}
}
int main(){
scanf("%d %d",&N,&M);
for(int i = 1;i<N;i++){
int u,v;
scanf("%d %d",&u,&v);
grafo[u].push_back(v);
grafo[v].push_back(u);
}
dfs1(1,-1);
correction[1] = 1;
dfs2(1,-1);
for(int i = 1;i<=N;i++) printf("%lld\n",ansP[i]);
return 0;
}
// Ivan Carvalho
// Problem W - Educational Dynamic Programming Contest - AtCoder
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2*1e5 + 10;
vector<int> adiciona[MAXN],retira[MAXN];
ll seg[4*MAXN],lazy[4*MAXN],dp[MAXN],valor[MAXN];
int N,M,ini[MAXN],fim[MAXN];
void propagate(int pos,int left,int right){
if(lazy[pos] == 0) return;
if(left != right){
lazy[2*pos] += lazy[pos];
lazy[2*pos+1] += lazy[pos];
}
seg[pos] += lazy[pos];
lazy[pos] = 0;
}
void update(int pos,int left, int right,int i,int j,ll delta){
propagate(pos,left,right);
if(left > right || left > j || right < i) return;
if(left >= i && right <= j){
lazy[pos] += delta;
propagate(pos,left,right);
return;
}
int mid = (left+right)/2;
update(2*pos,left,mid,i,j,delta);
update(2*pos+1,mid+1,right,i,j,delta);
seg[pos] = max(seg[2*pos],seg[2*pos+1]);
}
ll query(int pos,int left,int right,int i,int j){
propagate(pos,left,right);
if(left >= i && right <= j) return seg[pos];
int mid = (left+right)/2;
if(j <= mid) return query(2*pos,left,mid,i,j);
else if(i >= mid + 1) return query(2*pos+1,mid+1,right,i,j);
else return max(query(2*pos,left,mid,i,j), query(2*pos+1,mid+1,right,i,j));
}
int main(){
scanf("%d %d",&N,&M);
for(int i = 1;i<=M;i++){
scanf("%d %d %lld",&ini[i],&fim[i],&valor[i]);
adiciona[ini[i]].push_back(i);
retira[fim[i]].push_back(i);
}
for(int i = 1;i<=N;i++){
for(int j : adiciona[i]){
update(1,0,N,0,ini[j] - 1,valor[j]);
}
dp[i] = query(1,0,N,0,i-1);
update(1,0,N,i,i,dp[i]);
for(int j : retira[i]){
update(1,0,N,0,ini[j] - 1,-valor[j]);
}
}
ll best = 0;
for(int i = 1;i<=N;i++) best = max(best,dp[i]);
printf("%lld\n",best);
return 0;
}
// Ivan Carvalho
// Problem X - Educational Dynamic Programming Contest - AtCoder
#include <bits/stdc++.h>
using namespace std;
typedef tuple<int,int,int> trinca;
typedef long long ll;
const int MAXW = 2*1e4 + 10;
vector<trinca> guloso;
ll dp[MAXW];
int N;
int main(){
cin >> N;
for(int i = 1;i<=N;i++){
int w,s,v;
cin >> w >> s >> v;
guloso.push_back(make_tuple(s+w,w,v));
}
sort(guloso.begin(),guloso.end());
for(trinca davez : guloso){
int solid = get<0>(davez), w = get<1>(davez);
ll v = get<2>(davez);
for(int i = MAXW-1;i>=0;i--){
if(i + w <= solid){
dp[i+w] = max(dp[i+w],dp[i] + v);
}
}
}
ll best = 0;
for(int i = 0;i<MAXW;i++) best = max(best,dp[i]);
cout << best << endl;
return 0;
}
// Ivan Carvalho
// Problem Y - Educational Dynamic Programming Contest - AtCoder
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
typedef long long ll;
const int MAXN = 2*1e5 + 10;
const int MAXK = 3010;
const int MOD = 1e9 + 7;
vector<ii> pontos;
ll fatorial[MAXN],invfatorial[MAXN],qnts[MAXK];
int H,W,N;
ll fast_expo(ll x,int y){
if(y == 0) return 1;
if(y & 1) return (x*fast_expo(x,y-1)) % MOD;
ll temp = fast_expo(x,y/2);
return (temp*temp) % MOD;
}
ll binomial(ll n,ll k){
return ((fatorial[n]*invfatorial[k] % MOD)*invfatorial[n - k]) % MOD;
}
int main(){
fatorial[0] = invfatorial[0] = 1;
for(int i = 1;i<MAXN;i++){
fatorial[i] = (fatorial[i-1]*i) % MOD;
invfatorial[i] = fast_expo(fatorial[i],MOD - 2);
}
cin >> H >> W >> N;
pontos.push_back(ii(H,W));
for(int i = 0;i<N;i++){
int x,y;
cin >> x >> y;
pontos.push_back(ii(x,y));
}
sort(pontos.begin(),pontos.end());
for(int i = 0;i<=N;i++){
qnts[i] = binomial(pontos[i].first + pontos[i].second - 2, pontos[i].first - 1 );
}
for(int i = 0;i<N;i++){
for(int j = i+1;j<=N;j++){
int deltax = pontos[j].first - pontos[i].first;
int deltay = pontos[j].second - pontos[i].second;
if(deltax < 0 || deltay < 0) continue;
qnts[j] -= binomial(deltax+deltay,deltay)*qnts[i];
qnts[j] %= MOD;
}
}
if(qnts[N] < 0) qnts[N] += MOD;
cout << qnts[N] << endl;
return 0;
}
// Ivan Carvalho
// Problem Z - Educational Dynamic Programming Contest - AtCoder
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int MAXN = 2*1e5 + 10;
struct line{
ll a,b;
line(ll _a,ll _b){
a = _a;
b = _b;
}
ll get(ll x){return a*x + b;}
ld get(ld x){return a*x + b;}
};
ld inter(line l1,line l2){
return -(l1.b - l2.b)/ld(l1.a - l2.a);
}
bool useless(line l1,line l2,line l3){
return inter(l1,l3) < inter(l2,l1);
}
vector<line> CHT;
ll dp[MAXN],h[MAXN],C;
int chtPtr,N;
void add(line l){
while(CHT.size() >= 2 && useless(CHT[CHT.size()-2],CHT.back(),l) ){
CHT.pop_back();
}
CHT.push_back(l);
}
ll query(ll x){
if(chtPtr >= CHT.size()) chtPtr = CHT.size() - 1;
while(chtPtr + 1 < CHT.size() && CHT[chtPtr].get(x) > CHT[chtPtr+1].get(x) ){
chtPtr++;
}
return CHT[chtPtr].get(x);
}
int main(){
scanf("%d %lld",&N,&C);
for(int i = 1;i<=N;i++){
scanf("%lld",&h[i]);
}
add(line(-2*h[1], h[1]*h[1] + C ));
for(int i = 2;i<=N;i++){
dp[i] = query(h[i]) + h[i]*h[i];
add(line(-2*h[i], h[i]*h[i] + dp[i] + C ));
}
printf("%lld\n",dp[N]);
return 0;
}
@sasikr2
Copy link
Copy Markdown

sasikr2 commented Aug 9, 2020

I have a doubt in m.cpp (Candy distribution prob). What is the role of pref[] array.

@IvanIsCoding
Copy link
Copy Markdown
Author

I have a doubt in m.cpp (Candy distribution prob). What is the role of pref[] array.

It stands for prefix sum

@adelkhah
Copy link
Copy Markdown

adelkhah commented Aug 27, 2020

dude thank you so much for the short and easy to read code really helped me for learning the problems thanks again ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment