MnZn求调
查看原帖
MnZn求调
260061
Karl_Aurora楼主2023/9/27 17:36

Rt,44pts,和题解对照后感觉没什么问题,所以求大佬帮忙看一眼

没有大样例,失落。

#include <bits/stdc++.h>
#define maxn 200010
#define writesp(x) write(x), putchar(' ')
#define writeln(x) write(x), putchar('\n')
using namespace std;
template < typename T >
inline void read(T &X)
{
    X = 0; bool f = false; char ch = getchar();
    while (!isdigit(ch)) {f |= ch == '-'; ch = getchar();}
    while (isdigit(ch)) {X = (X * 10) + (ch ^ 48); ch = getchar();}
    X = f ? -X : X;
}
template < typename T >
inline void write(T X)
{
    if (X == 0) {putchar('0'); return;}
    if (X < 0) {putchar('-'); X = -X;}
    static char cnt = 0, num[20];
    while (X) {num[cnt++] = (X % 10) ^ 48; X /= 10;}
    while (cnt) putchar(num[--cnt]);
}
struct side
{
    int u, v, r, p;
    side (const int &_u = 0, const int &_v = 0, const int &_r = 0, const int &_p = 0) : u(_u), v(_v), r(_r), p(_p) {};
    bool operator < (const side &b) const {return this->r < b.r;}
};
vector < side > sidelist;
int sidehead[maxn], sidenext[maxn];
inline void buildside(const int &v, const int &id) {sidenext[id] = sidehead[v]; sidehead[v] = id;} 
int n, m;
int ans[maxn];
int out[maxn];
bool isvisited[maxn];
queue < int > q;
int main()
{
#ifndef ONLINE_JUDGE
    freopen("P7831.in", "r", stdin);
    freopen("P7831.out", "w", stdout);
#endif
    memset(ans, 0x3f, sizeof(ans)); memset(sidehead, -1, sizeof(sidehead));
    read(n); read(m);
    for (int i = 1; i <= m; ++i)
    {
        int a, b, r, p;
        read(a); read(b); read(r); read(p);
        sidelist.emplace_back(a, b, r, p);
        ++out[a];
    }
    for (int i = 1; i <= n; ++i) if (out[i] == 0) q.push(i);
    sort(sidelist.begin(), sidelist.end());
    for (int i = 0; i < m; ++i) buildside(sidelist[i].v, i);
    for (int i = m - 1; i >= 0; --i)
    {
        while (!q.empty())
        {
            int x = q.front();
            q.pop();
            for (int j = sidehead[x]; j != -1; j = sidenext[j])
            {
                if (isvisited[j]) continue;
                isvisited[j] = true;
                int from = sidelist[j].u, r = sidelist[j].r, p = sidelist[j].p;
                if (ans[x] != 0x3f3f3f3f) ans[from] = min(ans[from], max(ans[x] - p, r));
                --out[from];
                if (out[from] == 0) q.push(from);
            }
        }
        if (isvisited[i]) continue;
        int from = sidelist[i].u, r = sidelist[i].r;
        ans[from] = min(ans[from], r);
        --out[from];
        if (out[from] == 0) q.push(from);
    }
    for (int i = 1; i < n; ++i) writesp(ans[i] == 0x3f3f3f3f ? -1 : ans[i]);
    writeln(ans[n] == 0x3f3f3f3f ? -1 : ans[n]);
    return 0;
}
2023/9/27 17:36
加载中...