CF1025E Colored Cubes
由于原树是 \(BST\) 所以一颗子树为一段连续的区间。
考虑 \(DP\) 设\(f_{l,r,0}\) 表示 \([l,r]\) 区间以l为根是否可行 \(f_{l,r,1}\) 表示 \([l,r]\) 区间以r为根是否可行,转移枚举 \(k\in[l,r]\),\(f_{l-1,r,0}=f_{l,k,1}\&\&f_{k,r,0}\&\&can_{l-1,k}\),\(f_{l,r+1,1}=f_{l,k,1}\&\&f_{k,r,0}\&\&can_{k,r+1}\)。
代码
#include<bits/stdc++.h>
using namespace std;
namespace IO{
template<typename T>
inline void read(T&x){
x=0;char c=getchar();bool f=0;
while(!isdigit(c)) c=='-'?f=1:0,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
f?x=-x:0;
}
template<typename T>
inline void write(T x){
if(x==0){putchar('0');return ;}
x<0?x=-x,putchar('-'):0;short st[50],top=0;
while(x) st[++top]=x%10,x/=10;
while(top) putchar(st[top--]+'0');
}
inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}
inline void write(char c){putchar(c);}
inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}
inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}
template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}
template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}
template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=710;
int n,a[maxn],f[maxn][maxn][2];//f[l][r][0]:[l,r] 区间以l为根是否可行 f[l][r][1]:[l,r] 区间以r为根是否可行
bool can[maxn][maxn];
signed main(){
read(n);
for(int i=1;i<=n;i++) read(a[i]),f[i][i][0]=f[i][i][1]=1;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(__gcd(a[i],a[j])>1) can[i][j]=1;
for(int len=0;len<=n;len++) for(int l=1;l<=n;l++){
int r=l+len;if(r>n) break;
for(int k=l;k<=r;k++){
if(f[l][k][1]&&f[k][r][0]){
if(l==1&&r==n){write("Yes");return 0;}
if(l!=1&&can[l-1][k]) f[l-1][r][0]=1;
if(r!=n&&can[k][r+1]) f[l][r+1][1]=1;
}
}
}
write("No");
return 0;
}

浙公网安备 33010602011771号