Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38489 masppy 【S】T3 C++ 通过 100 1765 MS 326568 KB 1686 2025-10-08 16:41:08

Tests(56/56):


#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=5e5+10; const ll inf=1e10; const ll mod=998244353; ll n,m; ll a[maxn],tp=0,tmp[150]; int f[maxn][150]; int deg[maxn]; vector<int> q[maxn]; void merge(int u,int v){ memset(tmp,0,sizeof(tmp)); int u1=0,v1=0; for(int i=0;i<=125;i++){ if(!f[u][u1]&&(!f[v][v1])) break; // cout<<u<<" "<<v<<" "<<u1<<" "<<v1<<" "<<f[u][u1]<<" "<<f[v][v1]<<endl; if(!f[u][u1]) tmp[i]=f[v][v1++]; else if(!f[v][v1]) tmp[i]=f[u][u1++]; else if(f[u][u1]==f[v][v1]) tmp[i]=f[v][v1++],u1++; else if(a[f[u][u1]]>a[f[v][v1]]||(a[f[u][u1]]==a[f[v][v1]]&&f[u][u1]>f[v][v1])) tmp[i]=f[u][u1++]; else tmp[i]=f[v][v1++]; } for(int i=0;i<=125;i++) f[v][i]=tmp[i]; } void topo(){ queue<int> q1; for(int i=1;i<=n;i++){ f[i][0]=i; if(!deg[i]) q1.push(i); } while(!q1.empty()){ int pos=q1.front(); q1.pop(); int siz=q[pos].size(); for(int i=0;i<siz;i++){ int v=q[pos][i]; merge(pos,v); deg[v]--; if(!deg[v]) q1.push(v); } } } int main(){ // freopen("stone.in","r",stdin); // freopen("stone.out","w",stdout); scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); bool fg=0; for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); q[v].push_back(u); deg[u]++; } topo(); ll mx,tp; for(int i=1;i<=n;i++){ mx=-1,tp=0; while(tp<125&&f[i][tp]) tp++; tp--; for(int j=0;j<=tp;j++) tmp[j]=a[f[i][j]]; for(int j=0;j<=tp;j++){ for(int k=j+1;k<=tp;k++){ mx=max(mx,tmp[j]&tmp[k]); } } printf("%lld ",mx); } fclose(stdin); fclose(stdout); return 0; }


测评信息: