提交时间:2024-02-29 19:03:32

运行 ID: 27010

#include <bits/stdc++.h> using namespace std; #define int long long const int maxn=1e5+10; int n,m,L,R; int a[maxn]; vector<int> edge[maxn]; struct SOL1 { int f[60][60][210],g[60][60][210],ans[60]; void dfs(int u,int fa) { if(edge[u][0]==fa&&edge[u].size()==1) { if(a[u]>=L&&a[u]<=R) f[u][1][0]=1; if(a[u]<=R) f[u][0][a[u]]=1; return ; } bool flag=0; for(int i=0;i<edge[u].size();i++) { int v=edge[u][i]; if(v==fa) continue; dfs(v,u); if(!flag) { for(int j=0;j<=m;j++) { for(int k=R;k>=0;k--) { if(k<a[u]) break; f[u][j][k]|=f[v][j][k-a[u]]; } } flag=1; continue; } for(int j=0;j<=m;j++) { for(int k=R;k>=0;k--) { int t=0; for(int j1=0;j1<=m;j1++) { if(j1>j) break; for(int k1=0;k1<=R;k1++) { if(k1>k) break; t|=(f[u][j-j1][k-k1]&&f[v][j1][k1]); } } f[u][j][k]=t; } } } for(int j=m-1;j>=0;j--) { for(int i=L;i<=R;i++) f[u][j+1][0]|=f[u][j][i]; } } void sol() { dfs(1,0); for(int i=0;i<=m;i++) for(int k=L;k<=R;k++) ans[i]|=f[1][i][k]; for(int i=0;i<=m;i++) cout<<ans[i]; cout<<endl; } }sol1; signed main() { // freopen("large.in","r",stdin); // freopen("large.out","w",stdout); ios::sync_with_stdio(false); cin>>n>>m>>L>>R; for(int i=1;i<=n;i++) cin>>a[i]; int u,v; for(int i=1;i<n;i++) { cin>>u>>v; edge[u].push_back(v); edge[v].push_back(u); } if(R<=200) { sol1.sol(); return 0; } int p1=2,p2=n-a[n]; cout<<"00"; for(int i=p1;i<=p2;i++) cout<<1; for(int i=n-a[n]+1;i<=n;i++) cout<<0; cout<<endl; return 0; }