惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
B
Blog
博客园_首页
博客园 - 司徒正美
有赞技术团队
有赞技术团队
博客园 - 聂微东
I
InfoQ
美团技术团队
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog

某岛

AtCoder Beginner Contest 409 Luogu P5325. 【模板】Min_25 筛 UOJ #188. 【UR #13】Sanrd AtCoder Beginner Contest 371 AtCoder Beginner Contest 369 RPGMaker 2k3 百科 OneShot 的考古 2024“开创拓芯”游戏创享节的相关记录 CJ 回来后的戒断反应 Luogu P10221. [省选联考 2024] 重塑时光 Luogu P5308 [COCI2018-2019#4] Akvizna wqs 二分 歌唱王国 Lean 相关 BZOJ 3153. Sone1 The 2023 ICPC World Finals Luxor 新巴别塔 Sora 的想象与思考 Facebook Hacker Cup 2023 Round 1 AtCoder Beginner Contest 322 LLaMA 2 相关 HuggingFace AI Game Jam ACL 2023 Trans 相关… Luogu P2053. [SCOI2007] 修车 Luogu P1973. [NOI2011] NOI 嘉年华 Luogu P1933. [NOI2010] 旅行路线 Luogu P2048. [NOI2010] 超级钢琴 Luogu P2046. [NOI2010] 海拔 Luogu P3227. [HNOI2013] 切糕
Luogu P1954. [NOI2010] 航空管制
2023-06-09 · via 某岛

June 9, 2023

第一问显然可以 dag dp,求出每个点的真实最晚发车时间,
然后用这个东西贪心构造。

第二问还是用同一个 dp 数组,不过这次贪心构造的时候,我们忽略所有询问点传递闭包里的节点。

#include <lastweapon/io>
using namespace lastweapon;

const int N = int(2e3)+9;

VI adj[N], rdj[N]; int f[N], k[N], o[N];
bool vis[N];
int n, m;


void dfs(int u = 0) {
    vis[u] = 1; f[u] = k[u];
    for (auto v: adj[u]) {
        if (!vis[v]) dfs(v);
        checkMin(f[u], (f[v] ? f[v] : k[v]) - 1);
    }
}

void rfs(int u = 0) {
    vis[u] = 1; f[u] = 0;
    for (auto v: rdj[u])  {
        if (!vis[v]) rfs(v);
    }
}

int main() {

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif

    RD(n, m); REP(i, n) RD(k[i]);

    DO(m) {
        int a, b; RD(a, b), a--, b--;
        adj[a].PB(b);
        rdj[b].PB(a);
    }
    REP(i, n) if (!vis[i]) dfs(i); REP(i, n) o[i] = i;

    sort(o, o+n, [](int a, int b) {
         return f[a] < f[b];
    });

    REP(i, n) printf("%d ", o[i]+1); puts("");

    REP(i, n) {
        RST(vis); rfs(i); REP(i, n) if (!vis[i]) dfs(i);

        sort(o, o+n, [](int a, int b) {
            return f[a] > f[b];
        });

        int m = n-1; RST(vis);

        REP(ii, n) {
            int i = o[ii]; if (!f[i]) break;
            int t = min(m, f[i]);
            while (vis[t]) --t; vis[t] = 1;
            while (vis[m]) --m;
        }
        printf("%d ", m+1);
    }
}

Posted by xiaodao
Category: 日常