求调
查看原帖
求调
333855
int233楼主2023/9/18 21:36

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;
}
2023/9/18 21:36
加载中...