传送门

分析

我们首先想到的自然是根据大小关系建图,在这之后我们跑一遍拓扑排序

但是由于l和r的限制关系我们需要对传统的拓扑排序做一些改变

我们考虑将所有入度为0且现在的拓扑序号已经大于等于l的点放入一个优先队列,这个优先队列以r为关键字从小到大排序,这样我们就可以保证r小的点被排在前面

但是我们发现暴力判断l是否合法是行不通的,于是我们考虑再建一个优先队列,将所有入度为0的点以l为关键字从小到大排序,每次当队首l大于等于当前序号则弹出这个点,将这个点加入到r的那个优先队列中,这样我们就可以保证每个点最多在这个优先队列中进一次出一次

但是我们还要考虑一种情况,如果对于点1和点2,1的值小于2的值但是l[1]<l[2]且r[1]>r[2]则可能1的取值在区间(r[1],r[2]),那这种情况肯定是不合法的,所以我们要在求拓扑序等一众操作之前先对图进行一遍dfs来判断这个图是不是一个DAG并将点i的r值更新为min(l[i],l[I's son]),注意这个值是从后往前一一更新的,来保证对于点i,所有它能到达的点跟i的lr关系均合法

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
int n,m,le[],ri[],T,d[],id[],vis[],now[];
vector<int>v[];
priority_queue<pair<int,int> >ql,qr;
inline void dfs(int x){
if(now[x]){
puts("-1");
exit();
}else if(vis[x])return;
now[x]=;
for(int i=;i<v[x].size();i++){
dfs(v[x][i]);
ri[x]=min(ri[x],ri[v[x][i]]-);
}
vis[x]=;
now[x]=;
}
int main(){
int i,j,k;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)scanf("%d%d",&le[i],&ri[i]);
for(i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
v[x].pb(y);
d[y]++;
ri[x]=min(ri[x],ri[y]);
}
for(i=;i<=n;i++)
if(!d[i]&&!vis[i])dfs(i);
for(i=;i<=n;i++)
if(!d[i])ql.push(mp(-le[i],i));
T=;
while(!ql.empty()&&-ql.top().fi<=T)
qr.push(mp(-ri[ql.top().se],ql.top().se)),ql.pop();
while(!qr.empty()){
int x=qr.top().se;qr.pop();
if(ri[x]<T){
puts("-1");
return ;
}
id[T]=x;T++;
for(i=;i<v[x].size();i++)
if(d[v[x][i]]){
d[v[x][i]]--;
if(!d[v[x][i]])ql.push(mp(-le[v[x][i]],v[x][i]));
}
while(!ql.empty()&&-ql.top().fi<=T)
qr.push(mp(-ri[ql.top().se],ql.top().se)),ql.pop();
}
for(i=;i<=n;i++)if(!id[i]){puts("-1");return ;}
for(i=;i<=n;i++)printf("%d\n",id[i]);
return ;
}

ZROI2018提高day9t1的更多相关文章

  1. ZROI2018提高day6t2

    传送门 分析 将所有字母分别转化为1~26,之后将字符串的空位补全为0,?设为-1,我们设dp[p][c][le][ri]表示考虑le到ri个字符串且从第p位开始考虑,这一位最小填c的方案数,具体转移 ...

  2. ZROI2018提高day6t1

    传送门 分析 我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚 ...

  3. ZROI2018提高day5t3

    传送门 分析我们可以根据性质将这个序列构造成一个环:0,a[1~n],0,a[n~1] 这中间的0是为了起间隔作用的. 我们又知道b[i]=a[i-1]^a[i+1] c[i]=b[i-1]^b[i+ ...

  4. ZROI2018提高day5t2

    传送门 分析 考场上傻了,写了个树剖还莫名weila...... 实际就是按顺序考虑每个点,然后从他往上找,一边走一边将走过的边染色,如果走到以前染过色的边就停下.对于每一个a[i]的答案就是之前走过 ...

  5. ZROI2018提高day5t1

    传送门 分析 我们不难将条件转换为前缀和的形式,即 pre[i]>=pre[i-1]*2,pre[i]>0,pre[k]=n. 所以我们用dp[i][j]表示考虑到第i个数且pre[i]= ...

  6. ZROI2018提高day4t3

    传送门 分析 我们假设如果一个点是0则它的值为-1,如果一个点是1则值为1,则一个区间的答案便是max(pre[i]+sur[i]),这里的pre[i]表示此区间i点和它之前的的前缀的最大值,sur[ ...

  7. ZROI2018提高day4t2

    传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...

  8. ZROI2018提高day4t1

    传送门 分析 一道贪心题,我们用两个优先队列分别维护卖出的物品的价格和买入但没有卖出的物品的价格,然后逐一考虑每一个物品.对于每一个物品如果他比卖出的物品中的最低个价格,则改将现在考虑的物品卖出,将之 ...

  9. ZROI2018提高day3t3

    传送门 分析 我们对于每一个可以匹配的字符都将其从栈中弹出,然后他的哈希值就是现在栈中的字符哈希一下.然后我们便可以求出对于哪些位置它们的哈希值是一样的,即它们的状态是一致的.而这些点可以求出它们的贡 ...

随机推荐

  1. I.MX6 Android 5.1 回到 Android 4.2 emmc 启动

    /*************************************************************************** * I.MX6 Android 5.1 回到 ...

  2. main函数的参数的用法

    说明:main函数的参数的用法源代码: #include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[] ...

  3. HDU2065"红色病毒"问题【指数型母函数】

    Problem Description 医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其 ...

  4. 部署你的分布式调用链跟踪框架skywalking

    使用docker-compose 一键部署你的分布式调用链跟踪框架skywalking https://www.cnblogs.com/huangxincheng/p/9666930.html 一旦你 ...

  5. Linux 修改PostgreSQL外部访问白名单

    1. 查找配置文件 # find / -name pg_hba.conf # find / -name postgresql.conf 2.修改 2.1 修改pg_hba.conf 查找IPv4 lo ...

  6. LeetCode K-diff Pairs in an Array

    原题链接在这里:https://leetcode.com/problems/k-diff-pairs-in-an-array/#/description 题目: Given an array of i ...

  7. 类和对象(9)—— new和delete

    对象动态建立和释放 new 和delete 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C ...

  8. 利用MsChart控件绘制多曲线图表

    在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,发现MsC ...

  9. Poj 2488 A Knight's Journey(搜索)

    Background The knight is getting bored of seeing the same black and white squares again and again an ...

  10. Azure VM复制

    目前Azure上复制VM可以有多种方法: 1 创建User Image,可以快速复制多台VM,但目前托管磁盘只支持Generalized的模式,需要对User和配置进行重置. 2 从VHD或托管磁盘复 ...