吐槽
听得有点懵....
题目
解释
由于题目只有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;
}