제출 #1192690

#제출 시각아이디문제언어결과실행 시간메모리
1192690vnedu버스 (JOI14_bus)C++17
100 / 100
92 ms12744 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

template<class T> bool maximize(T &a, const T &b){ return (a < b ? a = b, 1 : 0); }
template<class T> bool minimize(T &a, const T &b){ return (a > b ? a = b, 1 : 0); }

#define fi first
#define se second

#define pb push_back
#define ii pair<int, int>

#define all(x) x.begin(), x.end()

#define TASK "nonsense"

/// end of template ///

const int N = 1e5 + 10;
const int M = 3e5 + 10;
const int inf = 1e9;
struct Edge
{
    int u,v,x,y;
    Edge() {}
    void input()
    {
        cin>>u>>v>>x>>y;
    }
} edge[M];
int numNode,numEdge,best[M];
vector<int> adj[N];
bool cmp(int id1, int id2)
{
    return edge[id1].y>edge[id2].y;
}
queue<int> q;
ii cur[M];
int suf[M];
void solve()
{
    cin>>numNode>>numEdge;
    for(int i=1;i<=numEdge;++i)
    {
        Edge &cm=edge[i];
        cm.input();
        adj[cm.v].pb(i);
        best[i]=inf;
    }
    for(int i=1;i<=numNode;++i) sort(all(adj[i]),cmp);
    while(!adj[numNode].empty())
    {
        q.push(adj[numNode].back());
        int curCost=edge[adj[numNode].back()].y;
        adj[numNode].pop_back();
        while(!q.empty())
        {
            int id=q.front(); q.pop();
//            cout<<edge[id].v<<' '<<edge[id].u<<'\n';
            minimize(best[id],curCost);
            int u=edge[id].u;
            while(!adj[u].empty())
            {
//                cout<<"DSA";
                int id2=adj[u].back();
                if(edge[id2].y>edge[id].x) break;
                adj[u].pop_back();
                q.push(id2);
            }
        }
    }
//    for(int i=1;i<=numEdge;++i)
//    {
//        Edge &cm=edge[i];
//        cout<<cm.u<<' '<<cm.v<<' '<<cm.x<<' '<<cm.y<<' '<<best[i]<<'\n';
//    }
//    return;
    int ptr=0;
    for(int i=1;i<=numEdge;++i) if(edge[i].u==1) cur[++ptr]=make_pair(edge[i].x,best[i]);
    sort(cur+1,cur+1+ptr);
    suf[ptr+1]=inf;
    for(int i=ptr;i>=1;--i) suf[i]=min(suf[i+1],cur[i].se);
    int numQuery; cin>>numQuery;
    while(numQuery--)
    {
        int t; cin>>t;
        int pos=lower_bound(suf+1,suf+1+ptr,t+1)-suf-1;
        cout<<(pos==0?-1:cur[pos].fi)<<'\n';
    }
}
int main()  {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

//    freopen(TASK".inp","r",stdin);
//    freopen(TASK".out","w",stdout);

    int testcase=1;
//    cin>>testcase;

    while (testcase--)
        solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...