Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33653 A21μΘ_wjy 【S】block C++ 解答错误 40 156 MS 10192 KB 2210 2024-10-18 13:27:19

Tests(8/20):


#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=1e5+7; bool ST; int n,m; int a[maxn]; int s[maxn]; int EU[maxn],EV[maxn]; vector<int> E[maxn]; vector<int> T[maxn]; int d[maxn]; void DFS(int u){ for(auto v:E[u])d[v]=d[u]+1,DFS(v); } //2^n int ans=0; int dfn[maxn]; int cnt=0; void DFST(int u){ dfn[u]=++cnt; for(auto v:T[u])DFST(v); } int chk(int S){ cnt=0; int c=__builtin_popcount(S); int rt=0; for(int i=1;i<=n;i++)T[i].clear(),dfn[i]=0; for(int u=1;u<=n;u++){ if(!(S&(1<<u-1)))continue; if(d[u]<d[rt])rt=u; for(auto v:E[u])if(S&(1<<v-1))c--,T[u].push_back(v); } if(c!=1)return -1e18; DFST(rt); for(int i=1;i<=m;i++){ if(!(dfn[EU[i]]&&dfn[EV[i]]))continue; if(abs(dfn[EU[i]]-dfn[EV[i]])==1)return -1e18; } int ret=0; for(int i=1;i<=n;i++)if(S&(1<<i-1))ret+=a[i]; return ret; } void BF(){ int ans=0; for(int i=0;i<(1ll<<n);i++)ans=max(ans,chk(i)); cout<<ans<<endl; return; } // Special Condition:DP int dp[maxn]; bool b[maxn]; inline void DP(int u){ dp[u]=a[u]; for(auto v:E[u]){ DP(v); if(v==E[u][0]&&b[u])continue; if(dp[v]>=0)dp[u]+=dp[v]; } } bool ED; signed main(){ // cerr<<abs(&ED-&ST)/1024.0/1024.0<<" MB"; // freopen("block.in","r",stdin);freopen("block.out","w",stdout); cin>>n>>m;d[0]=1e9; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++){ cin>>s[i]; for(int j=0;j<s[i];j++){ int v; cin>>v; E[i].push_back(v); } } DFS(1); for(int i=1;i<=m;i++)cin>>EU[i]>>EV[i]; if(n<=20){ BF(); return 0; } bool SC=1; for(int i=1;i<=m;i++){ if(s[EU[i]]==0||E[EU[i]][0]!=EV[i])SC=0; b[EU[i]]=1; } // bool SC=1; // for(int i=1;i<=m;i++){ // if(s[EV[i]]==0||E[EV[i]][0]!=EU[i])SC=0; // b[EV[i]]=1; // } if(SC){ DP(1); int ans=0; for(int i=1;i<=n;i++)ans=max(ans,dp[i]); cout<<ans<<endl; return 0; } }


测评信息: