「JSOI2010」排名

传送门

看到先后顺序限制和字典序,很容易想到拓扑排序 + 贪心。

考虑具体做法:

对于第一问:

我们开一个大根堆来代替队列,然后从大到小构造出各个元素的排名。

我们连边 \(i \to a_i\) ,表示 \(i\) 要在 \(a_i\) 后面,也就是满足 \(a_i\) 在 \(i\) 前面。

然后我们拓扑排序的时候每次取出的都是当前编号最大的并把它放在后面,也就满足了字典序尽量小的原则。

对于第二问:

我们还是考虑用堆来代替队列,但此时是要使得字典序尽量大,所以我们改为连边 \(a_i \to i\) ,然后从小到大构造排名即可。

(p.s. 但是这题数据好奇怪啊,我一开始在第二问的拓扑排序里面,写成每个节点直接往堆里丢,居然也过了???)

参考代码:

#include <cstring>
#include <cstdio>
#include <queue>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 2e5 + 5; int tot, head[_]; struct Edge { int ver, nxt; } edge[_];
inline void Add_edge(int u, int v) { edge[++tot] = (Edge) { v, head[u] }, head[u] = tot; } int n, a[_], dgr[_], rank, ans[_];
priority_queue < int > Q; inline void solve1() {
for (rg int i = 1; i <= n; ++i) if (a[i] != 0) Add_edge(i, a[i]), ++dgr[a[i]];
for (rg int i = 1; i <= n; ++i) if (dgr[i] == 0) Q.push(i);
rank = n;
while (!Q.empty()) {
int u = Q.top(); Q.pop(), ans[u] = rank--;
for (rg int i = head[u]; i; i = edge[i].nxt) if (!--dgr[edge[i].ver]) Q.push(edge[i].ver);
}
for (rg int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
} inline void solve2() {
tot = 0, memset(head, 0, sizeof head);
for (rg int i = 1; i <= n; ++i) if (a[i] != 0) Add_edge(a[i], i), ++dgr[i];
for (rg int i = 1; i <= n; ++i) if (dgr[i] == 0) Q.push(i);
rank = 1;
while (!Q.empty()) {
int u = Q.top(); Q.pop(), ans[u] = rank++;
for (rg int i = head[u]; i; i = edge[i].nxt) if (!--dgr[edge[i].ver]) Q.push(edge[i].ver);
}
for (rg int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
} int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n);
for (rg int i = 1; i <= n; ++i) read(a[i]);
solve1();
solve2();
return 0;
}

「JSOI2010」排名的更多相关文章

  1. 「JSOI2010」挖宝藏

    「JSOI2010」挖宝藏 传送门 由于题目中说道挖一个位置的前提是挖掉它上面的三个,以此类推可以发现,挖掉一个点就需要挖掉这个点往上的整个倒三角,那么也就会映射到 \(x\) 轴上的一段区间(可以发 ...

  2. 「JSOI2010」找零钱的洁癖

    「JSOI2010」找零钱的洁癖 传送门 个人感觉很鬼的一道题... 首先我们观察到不同的数最多 \(50\) 个,于是考虑爆搜. 但是这样显然不太对啊,状态数太多了. 然后便出现了玄学操作: \(\ ...

  3. 「JSOI2010」旅行

    「JSOI2010」旅行 传送门 比较妙的一道 \(\text{DP}\) 题,思维瓶颈应该就是如何确定状态. 首先将边按边权排序. 如果我们用 \(01\) 串来表示 \(m\) 条边是否在路径上, ...

  4. LG4171/BZOJ1823 「JSOI2010」满汉全席 2-SAT

    问题描述 LG4171 BZOJ1823 题解 显然,每个评委对每个材料的满式/汉式要求是对\(n\)个元素的\(0,1\)取值限制. 显然想到\(\mathrm{2-SAT}\) 于是就可以切掉了. ...

  5. 「JSOI2010」满汉全席

    前言 由于蒟蒻才刚开始学 \(\text{2-SAT}\),所以题解中有的地方可能不够精炼,望多包涵! 题目描述 题目意思很简单,标准的\(\text{2-SAT}\)问题模型.那么我们就先来介绍一下 ...

  6. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  7. LibreOJ2241 - 「CQOI2014」排序机械臂

    Portal Description 给出一个\(n(n\leq10^5)\)个数的序列\(\{a_n\}\),对该序列进行\(n\)次操作.若在第\(i\)次操作前第\(i\)小的数在\(p_i\) ...

  8. 「JSOI2014」学生选课

    「JSOI2014」学生选课 传送门 看到这题首先可以二分. 考虑对于当前的 \(mid\) 如何 \(\text{check}\) 我们用 \(f_{i,j}\) 来表示 \(i\) 对 \(j\) ...

  9. iOS 9,为前端世界都带来了些什么?「译」 - 高棋的博客

    2015 年 9 月,Apple 重磅发布了全新的 iPhone 6s/6s Plus.iPad Pro 与全新的操作系统 watchOS 2 与 tvOS 9(是的,这货居然是第 9 版),加上已经 ...

随机推荐

  1. map-apply-applymap

    In [1]: import warnings import math import pandas as pd import numpy as np import matplotlib warning ...

  2. kuangbin专题 专题九 连通图 POJ 1236 Network of Schools

    题目链接:https://vjudge.net/problem/POJ-1236 题目:有向图,有若干个连通图,点之间有单向边边就可以单向传递信息,问: (1)至少需要发送几份信息才能使得每个点都传递 ...

  3. 虚拟机kali Linux 的网络配置

    首先打开虚拟机中的kali 发现是没有办法连网的 然后我们将kaili关闭 然后打开 然后看黄色区域选择桥接模式然后重新启动即可 https://jingyan.baidu.com/article/7 ...

  4. github,gitlab的区别

    链接:https://blog.csdn.net/Xiamen_XiaoHong/article/details/83655447 总而言之:gitlab最优

  5. Ansible - playbook - 概要

    概述 简单描述 ansible playbook 1. playbook 概述 ansible 的 "脚本" 场景 ansible 单条命令, 执行一个操作 问题 如果执行多个操作 ...

  6. 一周搞定模拟电路P2_二极管介绍_记录

    1 稳压二极管 1.1 稳压二极管伏安特性曲线 ΔIz 这一段为能够达到比较好的稳压效果的稳压电流. 1.2 两种连接方法的比较 2 整流二极管 2.1 特点 用于把交流电变成脉动直流电 3 开关二极 ...

  7. 新手第一次在GitHub上提交代码完整教程

    提交步骤: 1.创建github repository(仓库) 2.安装git客户端 3.为Github账户设置SSH key 4.上传本地项目到github 一.创建github repositor ...

  8. python小白的爬虫之旅

    1.爬www.haha56.net/main/youmo网站的内容 ieimport requests import re response=requests.get("http://www ...

  9. JavaScript 对象属性与方法

    对象的创建: 1 字面量创建 var obj = {a:1,b:2}; 2 构造函数创建 var obj = new Object(); obj.a = 1; obj.b = 2; 3 Object. ...

  10. 17,a:img的alt和title有何异同? b:strong与en的异同?

    alt(alt text):为不能显示的图像,窗体或者applets的用户代理,alt属性用来指定替换文字.替换文字的语言用lang属性来指定. eg:下例中将图像作为链接来使用 <a href ...