2019.8.2金华暑假集训Day6讲课总结

吐槽

听得有点懵....

题目

解释

由于题目只有DP这里就只讲题目了

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
struct cow{int x,y;}e[N*2];
int n,a[N],head[N],top;
void inse(int xxxx,int yyyy)
{
	e[++top].x=head[xxxx];
	head[xxxx]=top;
	e[top].y=yyyy;
}
int ans=1;
vector<int>f[N];
vector<pair<int,int> >p[N];
void dfs(int x,int fa)
{
 	for(int i=head[x];i;i=e[i].x)
	{
		int y=e[i].y;if(y==fa)continue;dfs(y,x);
		for(int j=0;j<p[x].size();j++)
		  for(int k=0;k<p[y].size();k++)
		  {
		  	if(p[x][j].first!=p[y][k].first)continue;
			ans=max(ans,f[x][p[x][j].second]+f[y][p[y][k].second]);
		    f[x][p[x][j].second]=max(f[x][p[x][j].second],f[y][p[y][k].second]+1);
		  }
	}
}
int main()
{
	bool z=0;scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  {
	    scanf("%d",&a[i]);z+=(a[i]!=1);
	    int sum=a[i],tot=0;
	    for(int j=2;j*j<=sum;j++)
	    {
	    	if(sum%j!=0)continue;
	    	p[i].push_back(make_pair(j,tot));
	    	f[i].push_back(1);tot++;
	    	while(sum%j==0)sum/=j;
	    }
	    if(sum>1)
	    {
	    	p[i].push_back(make_pair(sum,tot));
	    	f[i].push_back(1);
	    }
	  }
	if(!z){cout<<0;return 0;}
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		inse(x,y);inse(y,x);
	}
	dfs(1,0);printf("%d",ans);
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
struct cow{int x,y;}e[N*2];
int n,head[N],tot;
void inse(int xxxx,int yyyy)
{
	e[++tot].x=head[xxxx];
	head[xxxx]=tot;
	e[tot].y=yyyy;
}
int ans[N],dp[N],cnt;
void dfs(int x,int fa,int mid)
{
	dp[x]=0;int mx1=0,mx2=0;
	for(int i=head[x];i;i=e[i].x)
	{
		int y=e[i].y;
		if(y==fa)continue;
		dfs(y,x,mid);
		if(dp[y]>mx1)mx2=mx1,mx1=dp[y];
	      else mx2=max(mx2,dp[y]);
	}
	if(mx1+mx2+1>=mid)dp[x]=0,cnt++;
	  else dp[x]=mx1+1;
}
void solve(int l,int r,int L,int R)
{
	if(l>r||L>R)return ;
	if(L==R)
	{
		for(int i=l;i<=r;i++)ans[i]=L;
		return ;
	}
	int mid=l+r>>1;cnt=0;dfs(1,0,mid);ans[mid]=cnt;
	solve(l,mid-1,cnt,R);solve(mid+1,r,L,cnt);
} 
int main()
{
	scanf("%d",&n);int gh=sqrt(n*log(n)/log(2));
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		inse(x,y);inse(y,x);
	}
	solve(1,n,0,n);
	for(int i=1;i<=n;i++)
	  printf("%d\n",ans[i]);
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define Mod 1000000007
const int N=1000100;
int ans,a[N],n,f[N];
vector<int>p[N];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
        for(int j=1;j*j<=a[i];j++)
        {
        	if(a[i]%j!=0)continue;
			p[i].push_back(j);
		    if(j*j!=a[i])p[i].push_back(a[i]/j);
        }
        sort(p[i].begin(),p[i].end());
    }f[0]=1;
 	for(int i=1;i<=n;i++)
 	  for(int j=p[i].size()-1;j>=0;j--)
 	  {
 	    f[p[i][j]]=(f[p[i][j]]+f[p[i][j]-1])%Mod;
 	    ans=(ans+f[p[i][j]-1])%Mod;
	  }
	printf("%d",ans);
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=100100;
char hard[4]={'h','a','r','d'};
ll n,a[N],f[N][5];char s[N];
int main()
{
	scanf("%lld%s",&n,&s);
	for(ll i=1;i<=n;i++)
	  scanf("%lld",&a[i]);
	memset(f,100,sizeof(f));
	for(ll i=1;i<5;i++)f[0][i]=0;
	for(ll i=1;i<=n;i++)
	  for(ll j=1;j<5;j++)
	    if(s[i-1]!=hard[j-1])f[i][j]=f[i-1][j];
	      else f[i][j]=min(f[i-1][j-1],f[i-1][j]+a[i]);
	ll minn=100000000000000000;
	for(ll i=0;i<5;i++)
	  minn=min(minn,f[n][i]);
	printf("%lld",minn);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值