Submission #1188994

#TimeUsernameProblemLanguageResultExecution timeMemory
1188994MalixTravelling Merchant (APIO17_merchant)C++20
0 / 100
1094 ms528344 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vii; typedef pair<int,int> pi; typedef vector<pi> pii; typedef tuple<ll,ll,ll> ti; typedef vector<ll> li; typedef vector<li> lii; #define REP(i,a,b) for(int i=a;i<b;i++) #define F first #define S second #define PB push_back #define LSOne(s) ((s)&(-s)) ll INF=1000000000000000010; int inf=1e9+10; ll M=1e9+7; int n,m,k; ll X[100][1000],Y[100][1000]; pair<ll,ll> dist[100][1001]; vector<vector<pair<int,ll>>> a; int main() { // ios::sync_with_stdio(0); // cin.tie(0); cin>>n>>m>>k; REP(i,0,100)REP(j,0,1001)dist[i][j]={-INF,-INF}; REP(i,0,n)REP(j,0,k)cin>>X[i][j]>>Y[i][j]; a.resize(n); REP(i,0,m){ int x,y;cin>>x>>y; ll z;cin>>z; x--;y--; a[x].PB({y,z}); } ll ans=0; REP(r,0,n){ priority_queue<tuple<double,int,int>> pq; REP(i,r,r+1)REP(j,0,k){ for(auto u:a[i])if(dist[u.F][j].F==-INF||(double)dist[u.F][j].F/(double)dist[u.F][j].F<(double)(-X[i][j])/(double)u.S){ dist[i][j]={-X[i][j],u.S}; } } REP(i,0,n)REP(j,0,k)if(dist[i][j].F!=-INF)pq.push({(double)dist[i][j].F/(double)dist[i][j].S,i,j}); while(!pq.empty()){ int x=get<1>(pq.top()); int y=get<2>(pq.top()); double z=get<0>(pq.top()); pq.pop(); ll p=dist[x][y].F; ll q=dist[x][y].S; if((double)p/(double)q>z)continue; if(y==1000){ REP(i,0,k)if(X[x][i]!=-1){ double c=(double)dist[x][i].F/(double)dist[x][i].S; double d=(double)(p-X[x][i])/(double)q; if(c<0&&d<0){ c=abs(c); d=abs(d); } if(dist[x][i].F==-INF||c<d){ dist[x][i]={p-X[x][i],q}; pq.push({(double)dist[x][i].F/(double)dist[x][i].S,x,i}); } } } else{ if(Y[x][y]!=-1&&p+Y[x][y]>0){ double c=(double)dist[x][1000].F/(double)dist[x][1000].S; double d=(double)(p+Y[x][y]/(double)q); if(c<0&&d<0){ c=abs(c); d=abs(d); } if(dist[x][1000].F==-INF||c<d){ dist[x][1000]={p+Y[x][y],q}; pq.push({(double)dist[x][1000].F/(double)dist[x][1000].S,x,1000}); } } } for(auto u:a[x]){ double c=(double)dist[u.F][y].F/(double)dist[u.F][y].S; double d=(double)p/(double)(q+u.S); if(c<0&&d<0){ c=abs(c); d=abs(d); } if(dist[u.F][y].F==-INF||c<d){ dist[u.F][y]={p,q+u.S}; pq.push({(double)dist[u.F][y].F/(double)dist[u.F][y].S,u.F,y}); } } } ans=max(ans,dist[r][1000].F/dist[r][1000].S); } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...