WA一个点,彻底寄寄。
求调。
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
int lim=2e9;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
vector<int> G[505];
bool vis[2005][15][505];
int n,f[2005][15],bs[1005],W[1005],rs,p[505],fa[505][15],dep[505],lgs[505],t[505],s[505],g[505],wz[15],b[15],r;
signed main(){
cin>>n;
for(int i=2;i<=n;i++){
lgs[i]=lgs[i>>1]+1;
cin>>p[i]>>t[i]>>s[i]>>g[i];
if(t[i]==2){
wz[++r]=i;
W[i]=r;
}
G[i].push_back(p[i]);
G[p[i]].push_back(i);
}
if(r==10){
f[-9999][0]=1;
}
if(!r){
q.push({s[1],1});
int flg=1,tl=1;
while(!q.empty()){
pair<int,int> cur=q.top();
q.pop();
if(vis[1<<r][1][cur.second]){
continue;
}
if(tl<cur.first){
flg=0;
break;
}
if(!vis[1<<r][1][cur.second]){
tl+=g[cur.second];
tl=min(tl,lim);
}
vis[1<<r][1][cur.second]=1;
for(int l=0;l<G[cur.second].size();l++){
if(!vis[1<<r][1][G[cur.second][l]]){
q.push({s[G[cur.second][l]],G[cur.second][l]});
}
}
}
if(flg){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
for(int i=1;i<(1<<r);i++){
for(int j=0;j<r;j++){
f[i][j]=-1;
}
}
for(int i=1;i<(1<<r);i++){
for(int j=0;j<r;j++){
if((i>>j)&1){
int tt=i-(1<<j);
if(!tt){
int xt=1,xx=wz[j+1],tl=1;
while(!q.empty()){
q.pop();
}
for(int k=1;k<=n;k++){
vis[i][j][k]=0;
}
q.push({s[1],1});
while(!q.empty()){
pair<int,int> cur=q.top();
q.pop();
if(vis[i][j][cur.second]){
continue;
}
if(tl<cur.first&&t[cur.second]==1){
break;
}
vis[i][j][cur.second]=1;
if(t[cur.second]==1){
tl+=g[cur.second];
tl=min(tl,lim);
}
if(W[cur.second]==j+1){
continue;
}
for(int l=0;l<G[cur.second].size();l++){
if(!vis[i][j][G[cur.second][l]]&&!(t[G[cur.second][l]]==2&&W[G[cur.second][l]]!=j+1)){
q.push({s[G[cur.second][l]],G[cur.second][l]});
}
}
}
if(vis[i][j][xx]){
f[i][j]=tl*g[xx];
f[i][j]=min(f[i][j],lim);
}
}
else{
for(int k=0;k<r;k++){
if((tt>>k)&1){
if(f[tt][k]==-1){
continue;
}
int ks=k,xx=wz[k+1],yy=wz[j+1],lcas,tl=f[tt][k],rp;
while(!q.empty()){
q.pop();
}
for(int kk=1;kk<=n;kk++){
vis[i][j][kk]=0;
}
q.push({s[xx],xx});
while(!q.empty()){
pair<int,int> cur=q.top();
q.pop();
if(vis[i][j][cur.second]){
continue;
}
if(tl<cur.first&&t[cur.second]==1){
break;
}
if(!vis[tt][k][cur.second]&&!vis[i][j][cur.second]&&t[cur.second]==1){
// cout<<r<<" "<<i<<" "<<j<<" "<<tt<<" "<<k<<" "<<f[tt][k]<<" "<<cur.second<<"鸡鸡"<<endl;
tl+=g[cur.second];
tl=min(tl,lim);
}
vis[i][j][cur.second]=1;
if(W[cur.second]==j+1){
continue;
}
for(int l=0;l<G[cur.second].size();l++){
if(!vis[i][j][G[cur.second][l]]&&!(t[G[cur.second][l]]==2&&(i>>(W[G[cur.second][l]]-1))%2==0)){
//if(G[cur.second][l]==4){
// cout<<r<<" "<<i<<" "<<j<<" "<<tt<<" "<<k<<" "<<f[tt][k]<<" "<<cur.second<<" "<<(i>>(W[G[cur.second][l]]-1))<<"鸡鸡爆"<<endl;
// }
q.push({s[G[cur.second][l]],G[cur.second][l]});
}
}
}
int flg=vis[i][j][yy];
if(flg){
//cout<<r<<" "<<i<<" "<<j<<" "<<tt<<" "<<k<<" "<<f[tt][k]<<" "<<tl<<endl;
if(f[i][j]<tl*g[wz[j+1]]){
for(int l=1;l<=n;l++){
vis[i][j][l]|=vis[tt][k][l];
}
}
f[i][j]=max(f[i][j],tl*g[wz[j+1]]);
f[i][j]=min(f[i][j],lim);
}
}
}
}
}
}
}
for(int i=0;i<r;i++){
if(f[(1<<r)-1][i]==-1){
continue;
}
int xx=wz[i+1],tl=f[(1<<r)-1][i],flg=1;
while(!q.empty()){
q.pop();
}
for(int kk=1;kk<=n;kk++){
vis[1<<r][i][kk]=0;
}
q.push({s[xx],xx});
while(!q.empty()){
pair<int,int> cur=q.top();
q.pop();
//cout<<r<<" "<<" "<<" "<<" "<<" "<<cur.second<<"鸡鸡"<<endl;
if(vis[1<<r][i][cur.second]){
continue;
}
if(tl<cur.first&&t[cur.second]==1){
flg=0;
break;
}
if(!vis[(1<<r)-1][i][cur.second]&&!vis[1<<r][i][cur.second]&&t[cur.second]==1){
//cout<<r<<" "<<" "<<" "<<" "<<" "<<cur.second<<"鸡鸡"<<endl;
tl+=g[cur.second];
tl=min(tl,lim);
}
vis[1<<r][i][cur.second]=1;
for(int l=0;l<G[cur.second].size();l++){
if(!vis[1<<r][i][G[cur.second][l]]){
q.push({s[G[cur.second][l]],G[cur.second][l]});
}
}
}
if(flg){
cout<<"Yes"<<endl;
return 0;
}
}
cout<<"No"<<endl;
return 0;
}