Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38031 LYLAKIOIAKIOI 【BJ】T1 C++ 无测评数据 90 152 MS 10512 KB 2745 2025-06-10 15:02:34

Tests(19/20):


#include<bits/stdc++.h> using namespace std; const int N=1050; //bf int n,ans[N],x[N],y[N]; void cmn(int &a,int b){if(b<a) a=b;} vector<int> E[N],G[N]; int dfn[N],low[N],scc[N],dc=0,sc=0; int f[N][N],g[N][N],du[N],tmp[N*2],siz[N]; stack<int> st;bool in_q[N]; void tj(int u){ dfn[u]=++dc;low[u]=dfn[u]; st.push(u);in_q[u]=1; for(auto v:E[u]){ if(!dfn[v]){ tj(v); low[u]=min(low[u],low[v]); }else if(in_q[v]){ low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]){ vector<int> ct; ++sc; while(!st.empty()){ int p=st.top();st.pop(); scc[p]=sc;in_q[p]=0; ct.push_back(p); if(p==u) break; } sort(ct.begin(),ct.end(), [&](int a,int b){return x[a]<x[b];}); g[sc][0]=0; for(int i=0;i<ct.size();i++){ int cnt=1,val=y[ct[i]]; cmn(g[sc][cnt],val); for(int j=0;j<ct.size();j++){ if(j==i) continue; cnt++;val+=x[ct[j]]; cmn(g[sc][cnt],val); } }siz[sc]=ct.size(); } } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>x[i]>>y[i]; int k;cin>>k; for(int j=1;j<=k;j++){ int x;cin>>x; E[i].push_back(x); } } memset(f,0x3f,sizeof(f));memset(g,0x3f,sizeof(g)); for(int i=1;i<=n;i++) f[i][0]=0; for(int i=1;i<=n;i++) if(!dfn[i]) tj(i); for(int i=1;i<=n;i++){ for(auto j:E[i]){ if(scc[i]==scc[j]) continue; G[scc[i]].push_back(scc[j]); du[scc[j]]++; } } queue<int> q; for(int i=1;i<=sc;i++) if(du[i]==0) q.push(i); while(!q.empty()){ int p=q.front();q.pop(); memset(tmp,0x3f,sizeof(tmp)); //for(int i=0;i<=n;i++) cout<<p<<' '<<i<<' '<<f[p][i]<<endl; for(int i=0;i<=n;i++){ for(int j=0;j<=siz[p];j++){ cmn(tmp[i+j],f[p][i]+g[p][j]); } }for(int i=0;i<=n;i++) f[p][i]=tmp[i]; //for(int i=0;i<=n;i++) cout<<p<<' '<<i<<' '<<f[p][i]<<endl; int sz=0; for(int i=0;i<=n;i++) if(f[p][i]<1e9) sz++; for(auto ed:G[p]){ du[ed]--; for(int i=0;i<=sz;i++){ if(f[p][i]>1e9) break; cmn(f[ed][i],f[p][i]); } if(!du[ed]) q.push(ed); } } memset(ans,0x3f,sizeof(ans)); for(int i=1;i<=sc;i++){ for(int j=1;j<=n;j++) cmn(ans[j],f[i][j]); }for(int i=1;i<=n;i++){ if(ans[i]<1e9) cout<<ans[i]<<endl; } return 0; }


测评信息: