首页 > 其他分享 >[题解]CF825E Minimal Labels

[题解]CF825E Minimal Labels

时间:2024-10-22 16:13:20浏览次数:7  
标签:int 题解 Labels 最小 re CF825E Minimal 字典

LPhang 为什么是神?

思路

显然可以想到一个错误的贪心:直接拓扑排序,每一次选择当前可以拓展的点中最小的元素进行编号。

由于可能存在一个值较小的元素被藏在一个较大的元素后面,这种贪心就会出问题。

出问题的本质原因就是我们希望字典序最小,就得使得越小的位置分配到更小的值。不妨建反图,进行拓扑排序,每一次将编号最大的点赋值。这样的操作可以规避上述问题,因为字典序最小不代表越大的位置一定要填越大的值,然而我们保证了越小的位置分配不到较大的值,从而满足字典序最小的限制。

Code

#include <bits/stdc++.h>
#define re register

using namespace std;

const int N = 1e5 + 10;
int n,m;
int num,ans[N];
int idx,h[N],ne[N],e[N],deg[N];

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

inline void add(int a,int b){
    ne[idx] = h[a];
    e[idx] = b;
    h[a] = idx++;
}

inline void topsort(){
    priority_queue<int> q;
    for (re int i = 1;i <= n;i++){
        if (!deg[i]) q.push(i);
    }
    while (!q.empty()){
        int u = q.top(); q.pop();
        ans[u] = num--;
        for (re int i = h[u];~i;i = ne[i]){
            int v = e[i];
            if (!(--deg[v])) q.push(v);
        }
    }
}

int main(){
    memset(h,-1,sizeof(h));
    n = num = read(),m = read();
    for (re int i = 1,a,b;i <= m;i++){
        a = read(),b = read();
        add(b,a); deg[a]++;
    }
    topsort();
    for (re int i = 1;i <= n;i++) printf("%d ",ans[i]);
    return 0;
}

标签:int,题解,Labels,最小,re,CF825E,Minimal,字典
From: https://www.cnblogs.com/WaterSun/p/18493149

相关文章

  • 历年CSP-J初赛真题解析 | 2017年CSP-J初赛完善程序(27-36)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客(快速幂)请完善下面的程序,该程序使用分治法求x......
  • CF2023D Many Games 题解
    赛时被创四了。思路考虑我们什么时候合并会比原来优。例如,我们现在要合并\(p_1,w_1\)和\(p_2,w_2\),同时保证,\(w_1\gew_2\)。那么有:\[\frac{p_1}{100}\timesw_1\le\frac{p_1}{100}\times\frac{p_2}{100}\times(w_1+w_2)\]\[\frac{p_2}{100}\timesw_2\le\frac{p_1}{......
  • 01 Eclipse使用Maven慢的问题解决
    1.Eclipse使用的是内置的MavenEclipse有可能使用了内置的Maven,而不是独立安装的Maven。如果使用Eclipse内置的Maven,默认的settings.xml可能并未生成。你可以按以下步骤检查或修改Maven设置路径:a.检查Eclipse使用的Maven配置点击Window->Preferences在......
  • 【题解】Solution Set - NOIP2024集训Day58 字符串
    【题解】SolutionSet-NOIP2024集训Day58字符串https://www.becoder.com.cn/contest/5658「CF1466G」SongoftheSirens考虑对于\(s_i\),算钦定必须覆盖到\(t_i\)的匹配个数\(f_i\)。注意到\(s\)每次长度都会\(\times~2\)左右,其长度在\(O(\log|w|)\)的时候就......
  • noi.ac775题解
    Gameb文件OI:gameb时限:1000ms空间:512MiBAlice和Bob正在玩一个游戏。具体来说,这个游戏是这样的,给定一个数列,从Alice开始,两个人轮流操作,每次操作可以从数列的头部或者尾部删去一个数字,当这个数列满足一定条件的时候,最后一次操作的人获胜。如果一开始就满足条......
  • correct = pred.eq(labels).sum() 的解读
            correct=pred.eq(labels).sum()怕是深度学习demo中最常见的代码了,eq()和sum()都是python中很常用的函数,但是这里的都是prtorch里面的函数,与python中的还是有一些区别的。python中的用法     python中的eq()的典型用法:fromoperatorimporteqa......
  • ZZJC新生训练赛第七场题解
    难度分类(同一难度下按字典序上升)入门:C简单:G,D中等:E,H,F,A困难:BC-解题思路数一下每个字母的数量看是不是偶数就可以得到答案。C-代码实现#include<bits/stdc++.h>intmain(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout......
  • NOI2024 D1T1 - 集合 题解
    观察我们称\(x\)在一段序列中的“位置集合”为\(x\)出现的下标的集合。注意到,两段序列能够匹配,当且仅当两段序列的\(1\simm\)中的数的位置集合构成的多重集相等。快速比较集合,考虑哈希。哈希先实现一个从整数到整数的哈希\(f(x)\)。使用这个哈希的目的是为了提高随机......
  • 题解 P11220 / MX241020D【【MX-S4-T4】「yyOI R2」youyou 的三进制数】
    好长的标题题目描述现在有\(0\simn\)共\(n+1\)个数。定义\((x)_{3}\)表示十进制数\(x\)的三进制形式。如果没有特别强调,那么这些数均为十进制形式。youyou想构造一个序列长度为\(p\)(\(p\ge1\))的非负整数序列\(a\)。使之满足:\(a_i\in[0,n]\)。不存在\(i......
  • P9890 [ICPC2018 Qingdao R] Tournament 题解
    P9890[ICPC2018QingdaoR]Tournament题目传送门更好的阅读体验一道找规律的思维题。前置知识\(lowbit\)\(lowbit\)是指获取一个二进制数中最右边的\(1\)所对应的数值。具体地,\(lowbit\)可以通过对一个数取反然后加\(1\),再与原数进行按位与的方式来实现。intlow......