提交时间:2024-10-21 20:47:38

运行 ID: 33754

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define m_p make_pair #define pi pair<int,int> #define p1 first #define p2 second #define ppc __builtin_popcount using namespace std; typedef long long ll; const int maxn=3e6+10; const double eps=1e-3,inf=1e18; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,S[44],RK[maxn]; int LIM[44][44]; vector<int>v[maxn]; ll dp[maxn][44],a[maxn],t[44]; void dfs(int u){ dp[u][RK[u]]=a[u]; for(int x:v[u]){ dfs(x); up(i,0,42)t[i]=dp[u][i]; up(i,0,42)if(!LIM[i][RK[x]])up(j,0,42)t[j]=max(t[j],dp[u][i]+dp[x][j]); up(i,0,42)dp[u][i]=t[i]; } } void slv(){ n=read(),m=read(); up(i,1,n)a[i]=read(); up(i,1,n){ int c=read(); while(c--)v[i].p_b(read()); } vector<pi>vec;vector<int>A; up(i,1,m){ int x=read(),y=read(); vec.p_b(m_p(x,y));A.p_b(x),A.p_b(y); } sort(A.begin(),A.end()); A.erase(unique(A.begin(),A.end()),A.end()); int sz=A.size(); for(auto it:vec){ int px=lower_bound(A.begin(),A.end(),it.p1)-A.begin()+1; int py=lower_bound(A.begin(),A.end(),it.p2)-A.begin()+1; RK[it.p1]=px,RK[it.p2]=py;LIM[px][py]=1; } up(i,1,n)up(j,0,42)dp[i][j]=-1e17; dfs(1);ll res=-1e18; up(i,1,n)up(j,0,42)res=max(res,dp[i][j]); cout<<res; } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); //int t;cin>>t;while(t--)slv(); //int t=read();while(t--)slv(); slv(); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }