【Gym 102059D】 Dumae(拓扑排序+区间分配)

深入理解拓扑排序(Topological sort) 什么是拓扑排序? 维基百科对于拓扑排序有如下定义: a topological sort or topological ordering of a directed graph is a linear ordering of its vertices such that for every directed edge uv from vertex u to vertex v, u com... 阅读详情

https://codeforc.es/gym/102059/problem/D

题意

有n个人进行排列,每个人都有个限制区间[L,R],同时有m个条件u,v,表示第u个人要排在第v个人之前。
请输出一种合法的方案。

题解

如果没有限制区间的话,那就是一个简单的拓扑排序。
必须是一个DAG图才有答案。

因为有了限制区间这个条件,需要对拓扑排序后的结果进行处理。

如果当前第i个人的排列为pi,第j个人在他之后,那么第j个人的Lj就可以进行修改,即 Lj = max( Lj, Li+1)。
同理第i个人的Ri也可以根据第j个人修改, Ri = min(Ri, Rj-1)。

这样就保证了拓扑排序后,一条链上的两两区间不相交。
但是对于不在一条链上的两个点需要贪心的分配。

现在贪心的分配每一个位置。
越小的L越早分配,对于L相同的,先分配R尽量小的。
例如[1,1],[1,2],[1,3]
最优的分配是 1 2 3。
如果不符合条件就输出-1。

代码

#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;

const int maxn = 3e5+5;
int n,m,deg[maxn],l[maxn],r[maxn];
vector<int> G[maxn];
vector<pii> v[maxn];
int a[maxn];

void topsort() {
    int p = 1;
    queue<int> que;
    for(int i = 1; i <= n; ++i)
        if(deg[i] == 0) que.push(i);
    while(!que.empty()) {
        int u = que.front();
        a[p++] = u;
        que.pop();
        for(int i = 0; i < G[u].size(); ++i) {
            int v = G[u][i];
            deg[v]--;
            if(deg[v] == 0) que.push(v);
        }

    }
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) scanf("%d%d", &l[i], &r[i]);

    for(int i = 0; i < m; ++i) {
        int u,v;
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
        deg[v]++;
    }
   
    topsort();
    for(int i = 1; i <= n; ++i) 
        if(deg[i] > 0) {
            puts("-1");
            return 0;
        }

    for(int i = 1; i <= n; ++i) {

        for(auto &j : G[a[i]]) {
            l[j] = max(l[j], l[a[i]]+1);
        }
    }
    reverse(a+1,a+1+n);
    for(int i = 1; i <= n; ++i) {
        for(auto &j : G[a[i]]) {

            r[a[i]] = min(r[a[i]], r[j]-1);
        }
    }

    // for(int i = 1; i <= n; ++i)
        // cout << l[i] <<" " << r[i] << endl;

    priority_queue<pii, vector<pii>, greater<pii> > pq;
    for(int i = 1; i <= n; ++i) {
        if(l[i] > r[i]) {
            puts("-1");
            return 0;
        }
        v[l[i]].push_back(pii(r[i],i));
    }
    vector<int> ans;
    for(int i = 1; i <= n; ++i) {
        for(int j = 0; j < v[i].size(); ++j) pq.push(v[i][j]);
        if(pq.empty() || pq.top().first < i) {
            puts("-1");
            return 0;
        } 
        
        ans.push_back(pq.top().second);
        pq.pop();
    }
    for(auto i: ans) {
        cout << i << endl;
    }
    return 0;
}
有向网建立,拓扑排序,以及最小生成树 (1)题目应实现的具体功能; 1) 创建有向网的存储结构并保存;(临接矩阵或邻接表) 2) 对网进行拓扑排序,输出拓扑序列; 3) 求出网的最小生成树,输出生成树的n-1边及权值之和; (2)题目所选择的数据结构及存储结构; 逻辑结构为网状结构,网的存储结构为邻接矩阵和邻接表的存储结构 立即下载

相关推荐

智能驾驶智慧交通行业智算中心(AIDC)建设规划方案.pptx

智能驾驶智慧交通行业智算中心(AIDC)建设规划方案.pptx

2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) 部分题解

比赛链接 A. Dumae 大致意思:n个人进行排队,给定每个人在队伍中的位置[Li,Ri][L_i,R_i][Li​,Ri​],给定m个关系ui,viu_i,v_iui​,vi​,uiu_iui​编号的人排在viv_ivi​编号的人前面。输出一个满足要求的队伍顺序。 解法:对于两个人u,v如果u排在v的前面,那么必须Lv>=Lu+1。Ru<=Rv−1L_v>=L_u+1。R_u<=R_v-1Lv​>=Lu​+1。Ru​<=Rv​−1。因此考虑建立对m对关系建立图,分别按

aaaaa124421421的博客 590

基于ROS2系统开发机器人

以上是基于ROS 2开发机器人的基本流程和一个简单的发布者-订阅者示例。通过这个流程,你可以逐步扩展和优化你的机器人系统,实现更复杂的功能。

xuweilin的博客 1493

codeforces gym102059 Timsort 思维

https://codeforces.com/gym/102059/problem/L 题目大意:给定一个包含nnn个元素的序列,qqq次询问,每次询问给一个值disdisdis,然后把原序列分段:每次分段从当前下标开始(初始为111),选择最长的且连续的单调非降序列或者单调下降序列,设其长度为lenlenlen,若len>=dislen>=dislen>=dis,则这一段的长度...

xiji333的博客 352

利用LATX技术在龙芯安同AOCS OS上部署坚果云:跨架构文件同步实战

本文详细介绍了如何在龙芯安同AOCS OS上,利用LATX指令翻译技术部署坚果云客户端,实现跨架构文件同步。通过安装LATX环境、解压x64安装包、运行安装脚本三步,成功在loongarch64架构上运行仅支持x86_64的软件,解决了国产平台办公协同的痛点,并分享了性能实测与优化建议。

weixin_29305337的博客 456

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操

本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。

m0_67958922的博客 3083

Gym 102059D Dumae(拓扑排序+优先队列贪心)

原题地址:https://codeforces.com/gym/102059/problem/D 题意:nnn 个人要排成一排,每个人想要站的位置都是一个区间,同时还有一些形如“xxx必须站在yyy左边”的限制,构造一组方案。 思路:如果只有后面的xxx在yyy的前面的限制,那么这就是一个简单的拓扑排序。但是这里还有区间的限制。 考入如果有xxx点的范围是[l1,r1][l_1,r_1][l1​,...

yiqzq的博客 464

STM32入门教程:智能马桶盖控制

通过编写相应的代码,您可以根据需要实现其他功能,例如座圈温度调节和液晶显示屏显示等。初始化配置 首先,使用STM32CubeMX创建一个新的工程,并选择您所使用的STM32单片机型号。智能马桶盖是一种集成了多种功能的智能家居设备,通过控制芯片来实现自动冲水、座圈加热、座圈温度调节等功能。在本教程中,我们将使用STM32系列单片机来控制智能马桶盖的各个功能。以上代码演示了如何通过STM32的GPIO控制引脚来控制智能马桶盖的冲水和座圈加热功能。写代码 接下来,我们将通过编写代码来控制智能马桶盖的各个功能。

2401_85258012的博客 657

【GYM 102059】2018-2019 XIX Open Cup, Grand Prix of Korea

vp了一场gym,我又开心地划水了。 A. Coloring Roads 题意:给定一棵树,树边一开始都是无色的,每次操作可以把一个点到根的路径染成某个颜色,每次询问当前树上出现过某个次数的颜色种数。 题解:看到操作与$Access$类似,考虑使用$lct$解决。由于一条重链的颜色一定是相同的,也就是一棵$splay$中的颜色都是相同的,所以$Access$时每次把整棵$splay$修改掉算...

weixin_30843605的博客 494

基于STM32+华为云设计的智慧农业灌溉系统(2023升级版)(158)

本项目设计一种基于STM32的智慧农业监测系统。该系统能够检测空气温度、湿度、光强度和土壤湿度等关键指标,并自动调节浇水量,实现作物生长环境的精细化管理。同时,本项目还支持本地LCD屏幕数据显示和通过ESP8266上传数据到华为云物联网平台,同时搭建流媒体服务器实现摄像头远程监控。最重要的是,本项目将利用Qt开发Android手机APP,使用户可以远程查看监测情况,了解农作物生成情况。

1万+

【vsomeip3 教程】SOME/IP中间件去抖策略全解析

本文探讨了在SOME/IP中间件中实现Debounce(去抖动)机制的必要性和实现原理。文章首先分析了中间件层进行Debounce的四大动机:多订阅者共享收益、语义显式化、协议噪声屏蔽和入口处背压控制。接着详细阐述了Debounce的底层原理,包括变化检测机制(ignore和mask的应用)、时间门控策略(interval的两种时间基准)以及超时补发机制,并通过表格清晰展示了不同参数组合的效果和适用场景。最后,文章提出了工程落地的具体方法,包括策略选型、ignore/mask的设计方法论以及分层验证调试的实

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 231

Dumae Gym - 102058A (贪心)

题目 https://cn.vjudge.net/problem/Gym-102058A 题意 让你构造一数组 满足给定的每个数的区间 和 相对关系 思路 贪心 先拓扑判环和找出拓扑序 然后找出每个点的真正的区间 即对于给定的 u->v 那么要满足ur <= vl-1 和 vl >= ul+1 (按拓扑序顺序缩区间) 然后依次贪心求每个位置的数 即对与满足当前位...

七九河开的博客 429

Python爬虫实战:股票历史数据抓取与量化回测全流程详解

我们以**东方财富网(eastmoney.com)和雪球网(xueqiu.com)**为主要目标,演示如何爬取A股历史行情。最常用的HTTP请求库,简单易用,适合静态页面数据请求。本文详细介绍了从股票历史数据抓取到简单回测的完整流程,代码示例基于最新技术,结构清晰,适合初学者和进阶者学习量化投资实战。希望对你入门Python爬虫和量化交易有所帮助!

2201_76125261的博客 1778

Problem D. Dumae(n个人每个都有限制区间 m个前后限制关系 问是否合法/输出一种 topo+贪心)

题目:gym 102059D 很经典吧 题意: n个人每个都有限制区间 m个前后限制关系 问是否合法/输出一种合法的排队序列。 思路: 先是先最基本的topo建图 然后根据得到的toposort之后的序列 更新每个人的[li,ri]。需要注意是怎么更新[li,ri]的。 如果当前第i个人的排列为pi,第j个人在他之后,那么第j个人的Lj就可以进行修改,即 Lj = max( Lj, Li+1)...

qq_42576687的博客 310

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇

YOLOv5知识蒸馏教程

Coding... 9361

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Gym - 102059D 2018-2019 XIX Open Cup, Grand Prix of Korea D. Dumae 贪心+堆

题面 题意:有3e5个人排成一列,然后Li,Ri表示每个人可以站在[Li,Ri]中的一个,然后M(1e6)个限制条件,某个人一定要在某个人前面,求一种合法方案,无解输出-1 题解:首先可以想到对于限制条件,先进行拓扑排序,如果不能则无解 针对拓扑排序的结果,可以更精确每个人站的位置的区间[Li,Ri] 然后从后往前进行考虑,我们考虑每个位置由谁来坐比较好,那...

weixin_34270606的博客 305

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Gym - 102059H 思维题

题目链接:https://codeforces.com/gym/102059/problem/H 思路:采取倒推的手段,我们根据题目给出的条件,可以知道(x+y)/gcd(x,y)<1000,那么x/gcd(x,y)+y/gcd(x,y)<1000,两个互质的数相加小于1000,那么这两个数一定都小于1000且互质,我们假设x/gcd(x,y)=i,y/gcd(x,y)=j,那么题目就转换成了在1000内找两个互质的数,并且在给定的范围内满足a<=igcd(x,y)<=b且c<

数据结构实验之栈与队列十一:refresh的停车场 235

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

gym 102059 C.Dstorv题解

gym 102059 C.Dstorv题解 首先可以发现最终一定是一个分界点i,(i<n)i,(i<n)i,(i<n)满足下标≤i的中留下AAA个全部向左,其余的留下BBB个全部向右。特殊的iii是那AAA中的一个,i+1i+1i+1是那BBB中的一个。 我们可以想到dpdpdp状态,fi,jf_{i,j}fi,j​表示考虑第iii位,右边有jjj个向左过来。 转移: (ai=′H′)(a_i='H')(ai​=′H′),fi−1,j+1→fi,jf_{i-1,j+1}\rightarr

qq_42925924的博客 318

Gym 102059 B Dev, Please Add This! 题解

首先可以根据题目信息建立有向图GGG,如果存在边u→vu\rightarrow vu→v则点uuu可以通过一步到达vvv。 然后我们在根据边建立一个有向图G′G\primeG′ 其中边u→vu\rightarrow vu→v表示边走完uuu这条边可以立刻走vvv这条边。 然后我们将G′G\primeG′跑一遍SCCSCCSCC。然后预处理出每一个SCCSCCSCC能取到的星星集合SSS,这个可以bitsetbitsetbitset搞。 这样我们暴力跑一边,看能不能拿到所有星星是会TLETLETLE的。我这题

qq_42925924的博客 687

拓扑排序

偏序与全序 这个应该是离散数学的内容,这里用口语来描述一下 偏序:两点之间不存在环路,不要求连通与否。 例子:合成需要药水A,药水B,这是两条连通的路,不存在环路,但是没有规定药水A和药水B的关系。 全序:就是在偏序的基础之上,有向无环图中的任意一对顶点还需要有明确的关系 比如药水A需要在药水B之前使用,就使这3个物品两两相连了。 拓扑排序 在图论中,由一个 有向无环图(DAG...

QAQ 550

Histogram Sequence Gym - 102059J

题目传送门:[https://codeforces.com/gym/102059/problem/J](https://codeforces.com/gym/102059/problem/J) 题意: 给定一个直方图,一个长度为n的序列表示每个柱子的高度,有一个数组A记录着直方图中每个不同子矩形的面积,A数组是按从小到大排序好的,给你L和R,让你输出A[L]到A[R]。思路:单调栈+二...

weixin_30274627的博客 218

Gym - 101608D(区间问题)

You want to prepare test cases for a problem with the following description: "Given an array of n positive integers, and a number of queries. Each query will ask about a range [l, r] (1 ≤ l ≤ r ≤ n),...

Fusheng_Yizhao的博客 737

【Gym 102059A】Coloring Roads(树链剖分+单调栈)

https://codeforc.es/gym/102059/problem/A 题意 给出一棵树。 询问u, c, m: 将结点u到根节点路径上的边都染色成c,询问染色边数为m的颜色有多少种。 题解 每次都是从一个结点到根,所以可以对这颗树进行树链剖分(heavy-light decompose) 维护 has[col]代表颜色col有多少条边。 cnt[m]边数为m的颜色有多少个。 dfn[v...

Link_Ray的博客 729

gym/102059 E

gym/102059 待通过:A、D、G、J、M 已补过:E E:电路题,判断一个图是不是简单电路。不需要特殊的技巧,利用set存图,把度数为2的点都删掉,融入到一条边上即可。 #include <algorithm> #include <iterator> #include <iostream> #include ...

weixin_30629653的博客 193

【Gym-102059 G】Fascination Street【亏欠型DP思想】

题意: 一条街上一共 NNN 个点,需要在某些点上建路灯,使得整条街被照亮,一个路灯可以照亮左右两个点,每个点都有一个建路灯的花费。现在你还有 KKK 次机会,可以交换两个路灯的建造费用,求使得整条街被照亮的最小花费。(1≤N≤250000,0≤k≤9)(1\leq N\leq 250000,0\leq k\leq 9)(1≤N≤250000,0≤k≤9) 思路: 如果这道题没有 KKK 次交换...

lucius-liu.cn 635
上一篇: 【2019湘潭邀请赛C】HDU 6534 Chika and Friendly Pairs(莫队)
下一篇: 【Gym 102059A】Coloring Roads(树链剖分+单调栈)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值