atcoder Educational DP Contest 解题报告

前言


传送门

本套题基本上包含了比较常见的dp类型的基础题。

可以见识一下不同种类的dp,值得dp非常弱的同学一做。

但是网上关于这套题的中文题解基本都不全,大部分写满26题的题解都是日文的,所以补题门槛有点高。而且日本人的技能树有点奇怪,有些方法可能跟国内的一些做法上还是有差异的。


A


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e5+7;

int h[N],dp[N];

int main(){
	int n=input();
	for(int i=1;i<=n;i++){
		h[i]=input();
	}
	dp[1]=0,dp[2]=abs(h[1]-h[2]);
	for(int i=3;i<=n;i++){
		dp[i]=min(dp[i-1]+abs(h[i-1]-h[i]),dp[i-2]+abs(h[i-2]-h[i]));
	}
	cout<<dp[n]<<endl;
} 

B


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e5+7;

int h[N],dp[N];

int main(){
	int n=input(),k=input();
	for(int i=1;i<=n;i++){
		h[i]=input();
	}
	dp[1]=0;
	for(int i=2;i<=n;i++){
		dp[i]=0x3f3f3f3f;
		for(int j=1;j<=k;j++){
			if(i-j<1) break; 
			dp[i]=min(dp[i-j]+abs(h[i-j]-h[i]),dp[i]);
		}
	}
	cout<<dp[n]<<endl;
} 

C


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e5+7;

int a[N],b[N],c[N];
int dp[N][3];

int main(){
	int n=input();
	for(int i=1;i<=n;i++){
		a[i]=input(),b[i]=input(),c[i]=input();
		dp[i][0]=max(dp[i-1][1],dp[i-1][2])+a[i];
		dp[i][1]=max(dp[i-1][0],dp[i-1][2])+b[i];
		dp[i][2]=max(dp[i-1][0],dp[i-1][1])+c[i];
	}

	cout<<max(dp[n][0],max(dp[n][1],dp[n][2]))<<endl;
}

D


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e5+7;

ll dp[N];

int main(){
	int n=input(),W=input();

	for(int i=1;i<=n;i++){
		ll w=input(),v=input();
		for(int j=W;j>=w;j--){
			dp[j]=max(dp[j-w]+v,dp[j]);
		}
	}
	cout<<dp[W]<<endl;
}

E


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e5+7;

ll dp[N],v[N],w[N];

int main(){
	ll n=input(),W=input();

	int V=0;

	for(int i=1;i<=n;i++){
		w[i]=input(),v[i]=input();
		V+=v[i];
	}

	fill(dp+1,dp+1+V,0x3f3f3f3f);

	int Ans=0;
	dp[0]=0;

	for(int i=1;i<=n;i++){
		for(int j=V;j>=0;j--){
			if(j+v[i]>V) continue;
			dp[j+v[i]]=min(dp[j]+w[i],dp[j+v[i]]);
		}
	}
	for(int i=1;i<=V;i++){
		if(dp[i]<=W) Ans=i;
	}
	
	cout<<Ans<<endl;
}

F


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=3007;

int dp[N][N];
string s,t;
string res;

int main(){
	cin>>s>>t;

	for(int i=0;i<s.length();i++){
		for(int j=0;j<t.length();j++){
			if(s[i]==t[j]) dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+1);
			dp[i+1][j+1]=max(dp[i+1][j+1],max(dp[i+1][j],dp[i][j+1]));
		}
	}

	int x=s.length(),y=t.length();
	while(x>0&&y>0){
		if(dp[x][y]==dp[x-1][y]) x--;
		else if(dp[x][y]==dp[x][y-1]) y--;
		else res=s[x-1]+res,x--,y--;
	}

	cout<<res<<endl;
}

G


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

#define ll long long
const int N=1e5+7;

vector <int> G[N];
int n,m;
stack <int> s;
int d[N],dis[N];
int Ans=0;

void bfs(){
	queue <int> q;
	for(int i=1;i<=n;i++){
		if(!d[i]) q.push(i);
	}
	while(!q.empty()){
		int u=q.front();q.pop();
		for(auto v:G[u]){
			d[v]--;
			if(d[v]==0)
				dis[v]=dis[u]+1,q.push(v);
		}
	}
}

int main(){
	n=input(),m=input();
	for(int i=1;i<=m;i++){
		int u=input(),v=input();
		G[u].push_back(v);
		d[v]++;
	}
	bfs();
	for(int i=1;i<=n;i++){
		Ans=max(Ans,dis[i]);
	}
	printf("%d\n",Ans);
}

H


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1007;
const ll mod=1e9+7;

int n,m;
int dp[N][N];
string s[N];

int main(){
	n=input(),m=input();
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}

	dp[1][1]=1;

	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j-1]=='#') continue;
			if(s[i][j-1]=='.')
				dp[i][j]+=dp[i][j-1],
				dp[i][j]%=mod;
			if(s[i-1][j-1]=='.')
				dp[i][j]+=dp[i-1][j],
				dp[i][j]%=mod;
		}
	}

	printf("%d\n",dp[n][m]);
}

I


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=3007;

int n;
double p[N];
double dp[N][N];
double Ans;

int main(){
	n=input();
	for(int i=1;i<=n;i++){
		scanf("%lf",&p[i]);
	}

	dp[0][0]=1;

	for(int i=1;i<=n;i++){
		for(int j=0;j<=i;j++){
			int x=j,y=i-j;
			if(x) dp[x][y]+=dp[x-1][y]*p[i];
			if(y) dp[x][y]+=dp[x][y-1]*(1-p[i]);
		}
	}
	int l=n,r=0;
	while(l>r){
		Ans+=dp[l][r];
		l--,r++;
	}
	printf("%.10lf\n",Ans);
}

J


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=307;
int a[4],n;
double dp[N][N][N];

double dfs(int a,int b,int c){
	if(dp[a][b][c]) return dp[a][b][c];
	if(a==0&&b==0&&c==0) return 0.0;
	double res=0;
	if(a) res+=dfs(a-1,b,c)*a;
	if(b) res+=dfs(a+1,b-1,c)*b;
	if(c) res+=dfs(a,b+1,c-1)*c;
	res+=1.0*n,res/=(a+b+c);
	return dp[a][b][c]=res;
}

int main(){
	n=input();
	for(int i=1;i<=n;i++)a[input()]++;
	printf("%.10lf\n",dfs(a[1],a[2],a[3]));
}

K


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e5+7;
int a[107];
int dp[N];

int main(){
	int n=input(),k=input();
	for(int i=1;i<=n;i++){
		a[i]=input();
	}

	for(int i=1;i<=k;i++){
		for(int j=1;j<=n;j++){
			if(i-a[j]>=0)
				dp[i]|=!(dp[i-a[j]]);
		}
	}

	if(dp[k]) printf("First\n");
	else printf("Second\n");
}

L


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=3007;

ll dp[N][N],a[N];

int main(){
	int n=input();
	for(int i=1;i<=n;i++) a[i]=input();

	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			int l=j-i+1,r=j;
			dp[l][r]=max(a[l]-dp[l+1][r],a[r]-dp[l][r-1]);
		}
	}
	printf("%lld\n",dp[1][n]);
}

M


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=107,M=1e5+7;
const ll mod=1e9+7;

ll dp[N][M],sum[M];
int a[N];

int main(){
	int n=input(),k=input();
	
	for(int i=0;i<n;i++) a[i]=input();
	for(int i=0;i<=n;i++) dp[i][0]=1;
	for(int i=1;i<=n;i++){
		sum[0]=0;
		for(int j=1;j<=k+1;j++) sum[j]=sum[j-1]+dp[i-1][j-1];
		for(int j=1;j<=k;j++) dp[i][j]=(sum[j+1]-sum[max(0,j-a[i-1])])%mod;
	}

	printf("%lld\n",dp[n][k]);
}

N


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=407;
const ll inf=0x3f3f3f3f3f3f3f;

int a[N];
ll dp[N][N],sum[N];

int main(){
	int n=input();
	for(int i=1;i<=n;i++){
		a[i]=input();
		sum[i]=sum[i-1]+a[i];
	}

	for(int i=1;i<=n;i++){
		for(int j=1;j<=n-i;j++){
			int k=j+i;
			dp[j][k]=inf;
			ll tmp=sum[k]-sum[j-1];
			for(int o=j;o<=k;o++){
				dp[j][k]=min(dp[j][k],dp[j][o]+dp[o+1][k]+tmp);
			}
		}
	}

	printf("%lld\n",dp[1][n]);
}

O


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=22;
const int mod=1e9+7;

int n,a[N][N],dp[1<<N];

int main(){
	n=input();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[i][j]=input();
		}
	}

	dp[0]=1;

	for(int i=0;i<(1<<n);i++){
		int t= __builtin_popcount(i);
		for(int j=1;j<=n;j++){
			if(i&(1<<(j-1))&&a[t][j]){
				dp[i]=(dp[i]+dp[i^(1<<(j-1))])%mod;
			}
		}
	}
	printf("%d\n",dp[(1<<n)-1]);
}

P


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

#define pb push_back

const int N=1e5+7,mod=1e9+7;

vector <int> G[N];
ll dp[N][2];

void dfs(int u,int fa){
	dp[u][0]=dp[u][1]=1;
	for(auto v:G[u]){
		if(v==fa) continue;
		dfs(v,u);
		dp[u][0]*=(dp[v][0]+dp[v][1]),dp[u][0]%=mod;
		dp[u][1]*=dp[v][0],dp[u][1]%=mod;
	}
}

int main(){
	int n=input();
	for(int i=1;i<n;i++){
		int u=input(),v=input();
		G[u].pb(v),G[v].pb(u);
	}

	dfs(1,0);

	printf("%lld\n",(dp[1][0]+dp[1][1])%mod);
}

Q


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

#define lowbit(x) x&-x

const int N=2e5+7;

ll dp[N];
ll a[N],h[N],t[N];
int n;

void update(int x,ll y){for(;x<=n;x+=lowbit(x)) t[x]=max(t[x],y);}
ll query(int x){ll res=0;for(;x;x-=lowbit(x)) res=max(res,t[x]);return res;}

int main(){
	n=input();
	for(int i=1;i<=n;i++) h[i]=input();
	for(int i=1;i<=n;i++) a[i]=input();

	for(int i=1;i<=n;i++){
		dp[i]=query(h[i])+a[i];
		update(h[i],dp[i]);
	}
	printf("%lld\n",query(n));
}

R


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=57;
const ll mod=1e9+7;
ll n,k;
struct mat{
	ll a[N][N];
	mat(){memset(a,0,sizeof(a));}
};

mat operator *(mat a,mat b){
	mat res;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				res.a[i][j]=(res.a[i][j]+(a.a[i][k]*b.a[k][j])%mod)%mod;
			}
		}
	}
	return res;
}

mat powmod(mat a,ll k){
	mat res;
	for(int i=1;i<=n;i++) res.a[i][i]=1;
	while(k){
		if(k&1) res=res*a;
		a=a*a;
		k>>=1;
	}
	return res;
}


int main(){
	n=input(),k=input();
	mat a;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a.a[i][j]=input();

	a=powmod(a,k);

	ll Ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			Ans=(Ans+a.a[i][j])%mod;

	printf("%lld\n",Ans);
}

S


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e4+7,M=107;
const ll mod=1e9+7;

int K[N],D;
ll dp[N][M],vis[N][M];
int n;

ll dfs(int pos,int sum,int lim){
	if(!lim&&vis[pos][sum]) return dp[pos][sum];
	if(pos==n+1){if(!sum) return 1;return 0;}
	int mx=lim? K[pos]:9;ll res=0;
	for(int i=0;i<=mx;i++){
		res=(res+dfs(pos+1,(sum+i)%D,lim&&(i==mx)))%mod;
	}
	if(!lim) dp[pos][sum]=res,vis[pos][sum]=1;
	return res;
}

int main(){
	char ch=getchar();
	while(ch>='0'&&ch<='9') K[++n]=ch-'0',ch=getchar();
	D=input();
	printf("%lld\n",(dfs(1,0,1)-1+mod)%mod);
}

T


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=3007;
const ll mod=1e9+7;

ll dp[N],pre[N],suf[N];

int main(){
	int n=input();
	dp[1]=suf[1]=pre[1]=1;
	for(int i=2;i<=n;i++){
		char ch=getchar();
		if(ch=='<') for(int j=1;j<=i;j++) dp[j]=pre[j-1];
		else for(int j=1;j<=i;j++) dp[j]=suf[j];
		for(int j=1;j<=i;j++) pre[j]=(pre[j-1]+dp[j])%mod;
		for(int j=i;j>=1;j--) suf[j]=(suf[j+1]+dp[j])%mod;
	}
	printf("%lld\n",pre[n]);
}

U


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=20,M=1<<N;

ll st[M],dp[M];
int a[N][N];

int main(){
	int n=input();
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			a[i][j]=input();

	for(int t=0;t<(1<<n);t++){
		for(int i=0;i<n;i++)
			for(int j=i+1;j<n;j++){
				if((t&(1<<i))&&(t&(1<<j)))
					st[t]+=a[i][j];
			}
	}

	for(int t=0;t<(1<<n);t++){
		for(int t2=t;t2>0;t2=(t2-1)&t){
			ll tmp=dp[t-t2]+st[t2];
			dp[t]=max(dp[t],tmp);
		}
	}

	printf("%lld\n",dp[(1<<n)-1]);
}

V


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

#define pb push_back

const int N=1e5+7;

ll n,mod;
vector <int> G[N];
ll dp[N],Ans[N];

void dfs1(int u,int fa){
	dp[u]=1;
	for(auto v:G[u]){
		if(v==fa) continue;
		dfs1(v,u);
		dp[u]=dp[u]*(dp[v]+1)%mod;
	}
}

void dfs2(int u,int fa){
	vector<ll> suf;
	ll tmp=1;
	suf.pb(1);
	for(int i=G[u].size()-1;i>=0;i--){
		tmp=tmp*(dp[G[u][i]]+1)%mod;
		suf.pb(tmp);
	}

	tmp=1;
	int it=suf.size()-2;

	for(auto v:G[u]){
		Ans[v]=dp[v]*(tmp*suf[it]%mod+1)%mod;
		if(v!=fa){
			ll tt=dp[u];
			dp[u]=tmp*suf[it]%mod;
			dfs2(v,u);
			dp[u]=tt;
		}
		tmp=tmp*(dp[v]+1)%mod;
		it--;
	}
}

int main(){
	n=input(),mod=input();
	for(int i=1;i<n;i++){
		int u=input(),v=input();
		G[v].pb(u);
		G[u].pb(v);
	}

	dfs1(1,0);
	dfs2(1,0);
	Ans[1]=dp[1];
	
	for(int i=1;i<=n;i++){
		printf("%lld\n",Ans[i]);
	}
}

W


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=2e5+7;

ll t[N<<2],lazy[N<<2];

void putdown(int rt){
	if(lazy[rt]){
		t[rt<<1]+=lazy[rt];
		t[rt<<1|1]+=lazy[rt];
		lazy[rt<<1]+=lazy[rt];
		lazy[rt<<1|1]+=lazy[rt];
		lazy[rt]=0;
	}
}

void put(int rt){
	t[rt]=max(t[rt<<1],t[rt<<1|1]);
}

ll query(int rt,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return t[rt];
	putdown(rt);
	int mid=(l+r)>>1;
	if(qr<=mid) return query(rt<<1,l,mid,ql,qr);
	if(mid<ql) return query(rt<<1|1,mid+1,r,ql,qr);
	return max(query(rt<<1,l,mid,ql,qr),query(rt<<1|1,mid+1,r,ql,qr));
}

void update(int rt,int l,int r,int ul,int ur,ll x){
	if(ul<=l&&r<=ur){t[rt]+=x,lazy[rt]+=x;return;}
	putdown(rt);
	int mid=(l+r)>>1;
	if(ul<=mid) update(rt<<1,l,mid,ul,ur,x);
	if(ur>mid) update(rt<<1|1,mid+1,r,ul,ur,x);
	put(rt);
}

struct opr{
	int l,r,c;
}a[N];
bool cmp(opr a,opr b){
	return a.r<b.r;
}

int main(){
	int n=input(),m=input();
	for(int i=1;i<=m;i++){
		a[i].l=input(),a[i].r=input(),a[i].c=input();
	}

	sort(a+1,a+1+m,cmp);

	ll p=0;

	for(int i=1;i<=n;i++){
		update(1,0,n,i,i,query(1,0,n,0,i-1));
		while(p<m&&a[p+1].r==i) p++,update(1,0,n,a[p].l,a[p].r,a[p].c);
	}
	printf("%lld\n",query(1,0,n,0,n));
}

X


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=1e4+7;

ll dp[N];
struct node{
	ll w,s,v;
}a[1007];

bool cmp(node a,node b){
	return a.s-b.w>b.s-a.w;
}

int main(){
	int n=input();
	for(int i=1;i<=n;i++){
		a[i].w=input(),a[i].s=input(),a[i].v=input();
	}

	sort(a+1,a+1+n,cmp);

	for(int i=1;i<=n;i++){
		for(int j=a[i].w;j<=10000;j++)
			dp[min(j-a[i].w,a[i].s)]=max(dp[min(j-a[i].w,a[i].s)],dp[j]+a[i].v);
		dp[a[i].s]=max(dp[a[i].s],a[i].v);
	}
	ll Ans=0;
	for(int i=0;i<=10000;i++) Ans=max(Ans,dp[i]);
	printf("%lld\n",Ans);
}

Y


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

#define PII pair<ll,ll>
#define X first
#define Y second
#define mp make_pair

const int N=2e5+7;
const ll mod=1e9+7;

ll fac[N],inv[N];

void pre(){
	fac[0]=fac[1]=inv[0]=inv[1]=1;
	for(int i=2;i<N;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
	for(int i=2;i<N;i++) inv[i]=inv[i-1]*inv[i]%mod,fac[i]=fac[i-1]*i%mod;
}

ll C(int m,int n){
	return fac[m]*inv[m-n]%mod*inv[n]%mod;
}

int n,m,k,dp[3007];
PII a[3007];

int main(){
	pre();
	n=input(),m=input(),k=input();

	for(int i=1;i<=k;i++){
		a[i].X=input(),a[i].Y=input();
		if((a[i].X==1&&a[i].Y==1)||(a[i].X==n&&a[i].Y==m)) printf("0\n"),exit(0);
	}

	a[++k].X=n,a[k].Y=m;
	sort(a+1,a+1+k);

	for(int i=1;i<=k;i++){
		dp[i]=C(a[i].X+a[i].Y-2,a[i].X-1);
		for(int j=1;j<i;j++){
			if(a[j].X<=a[i].X&&a[j].Y<=a[i].Y){
				ll x=a[i].X-a[j].X,y=a[i].Y-a[j].Y;
				dp[i]=(dp[i]-dp[j]*C(x+y,x)%mod+mod)%mod;
			}
		}
	}
	printf("%lld\n",dp[k]);
}

Z


#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}


struct Line
{
    ll m,b;
    ll get(ll x)
    {
        return m*x+b;
    }
};

struct ConvexHull
{
    int size;
    vector<Line> hull;
    ConvexHull(int maxSize)
    {
        hull=vector<Line>(maxSize+1);
        size=0;
    }
    bool isBad(int l1,int l2,int l3)
    {
        double left=1.0*(hull[l3].b-hull[l1].b)/(hull[l1].m-hull[l3].m);
        double right=1.0*(hull[l1].b-hull[l2].b)/(hull[l2].m-hull[l1].m);
        return left<right;
    }
    void addLine(ll m,ll b)
    {
        hull[size++]=Line{m,b};
        while(size>2&&isBad(size-3,size-2,size-1))
        {
            hull[size-2]=hull[size-1];
            --size;
        }
    }
    ll query(ll x)
    {
        int l=0,r=size-1;
        while(l<r)
        {
            int m=(l+r)/2;
            if(hull[m].get(x)>=hull[m+1].get(x))
                l=m+1;
            else
                r=m;
        }
        return hull[l].get(x);
    }
};

const int N=2e5+7;
ll n,c,h[N],dp[N];

int main(){
	n=input(),c=input();
	for(int i=1;i<=n;i++){
		h[i]=input();
	}

	ConvexHull t(N);
	dp[1]=0;
	t.addLine(-2*h[1],h[1]*h[1]+dp[1]);

	for(int i=2;i<=n;i++){
		dp[i]=t.query(h[i])+h[i]*h[i]+c;
		t.addLine(-2*h[i],h[i]*h[i]+dp[i]);
	}

	printf("%lld\n",dp[n]);
}

posted @ 2020-03-14 12:38  _aether  阅读(396)  评论(0编辑  收藏  举报