三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

P11927 [PA 2025] 重金属 / Heavy Metal 题解

P11927 [PA 2025] 重金属 / Heavy Metal 题解

题目链接:P11927 [PA 2025] 重金属 / Heavy Metal

观察到 $ n $ 特别小以至于 $ O(nsqrt(V)) $ 也能过,考虑根号分治值域 meet in middle,做完了。

代码:

#include<bits/stdc++.h>
#define time(null) chrono::steady_clock::now().time_since_epoch().count()
#define int long long
#define uint unsigned long long
#define debug() cout<<"come here\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define Code return
#define by 0
#define MCYYDS ;
using namespace std;
int qpow(int a,int b,int p=INF){int ret=1;while(b){if(b&1)ret=(ret*a)%p;a=(a*a)%p;b>>=1;}return ret;}
inline int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9')f=(ch=='-'?-1:f),ch=getchar();while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();return ret*f;}
inline void write(int x){if(x<0){putchar('-');write(-x);return ;}if(x>9)write(x/10);putchar((char)(x%10+48));}
inline void writech(int x,char ch){write(x);putchar(ch);}
int n,m,p[205];
vector<pii > e[205],re[205];
vector<int> g[205],val[205];
bool f[205][40005],vis[205][25005];
int dis[205][25005];
priority_queue<pair<int,pii > > q;
stack<int> s;
bool cmp(pii x,pii y)
{return x.second<y.second;
}
signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);int T=read();while(T--){int n=read(),m=read();for(int i=1;i<=n;i++){p[i]=read();}for(int i=1;i<=m;i++){int u=read(),v=read(),w=read();e[u].pb({v,w});re[v].pb({u,w});if(w==1)g[u].pb(v); }for(int i=1;i<=n;i++){sort(e[i].begin(),e[i].end(),cmp);}f[1][1]=1;for(int i=1;i<=40000;i++){for(int j=1;j<=n;j++){if(f[j][i])s.push(j);}while(s.size()){int u=s.top();s.pop();for(auto v:g[u]){if(p[v]>=i&&!f[v][i]){f[v][i]=1;s.push(v);}}}for(int j=1;j<=n;j++){if(!f[j][i])continue;for(auto x:e[j]){int v=x.first,w=x.second;if(i*w<=40000&&i*w<=p[v])f[v][i*w]=1;}}}for(int i=1;i<=n;i++){memset(dis[i],0xcf,sizeof(dis[i]));}dis[n][1]=p[n];q.push({p[n],{n,1}});while(q.size()){int u=q.top().second.first,x=q.top().second.second;q.pop();if(vis[u][x])continue;vis[u][x]=1;for(auto y:re[u]){int v=y.first,w=y.second;if(x*w<=25000&&dis[v][x*w]<min(p[v],dis[u][x]/w)){dis[v][x*w]=min(p[v],dis[u][x]/w);q.push({dis[v][x*w],{v,x*w}});}}}for(int i=1;i<=40000;i++){for(int j=1;j<=n;j++){if(!f[j][i])continue;for(auto x:e[j]){val[x.first].pb(x.second*i);}}}int ans=-1;for(int i=1;i<=n;i++){sort(val[i].begin(),val[i].end());int r=25000;for(auto x:val[i]){while(r&&dis[i][r]<x)r--;if(r)ans=max(ans,r*x);}}writech(ans,'\n');for(int i=1;i<=n;i++){val[i].clear();e[i].clear();re[i].clear();g[i].clear();memset(f[i],0,sizeof(f[i]));memset(vis[i],0,sizeof(vis[i]));}}Code by MCYYDS
}
← 返回列表