题意:有排列p, 令\(nxt_i\)为\(p_i\)右侧第一个大于\(p_i\)的数的位置,若不存在则\(nxt_i=n+1\)

现在整个p和nxt的一部分丢失了,请根据剩余的nxt,构造出一个符合情况的p,输出任意一解。


使有解的充要条件是对于每一个i不存在\(j\in(i,nex_i)\)满足\(nex_j>nex_i\)

也就是说对于每个\(i\)向\(nxt_i\)连一条边,然后没有两条边相交

对于点\(i\)向\(nex_i\)和满足\(j<i \ \wedge nex_j>nex_i\)的最小的j连边

这样的话就是一个拓扑图

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define M 2100001
#define N 500010
using namespace std; int n,m,k,a[N],d[M],s[N],ver[N],t[N],T,B;
queue<int> q; void ins(int now,int l,int r,int k,int x)
{
if(l==r)
{
d[now]=k;
return;
}
int mid=(l+r)>>1;
if(x<=mid) ins(now*2,l,mid,k,x);
else ins(now*2+1,mid+1,r,k,x);
d[now]=1;
} int ask(int now,int l,int r,int L)
{
if(l==r) return d[now];
int mid=(l+r)>>1, k=0;
if(L<=mid && d[now*2]) k=ask(now*2,l,mid,L);
if(!k)return ask(now*2+1,mid+1,r,L);
return k;
} void rb(int now,int l,int r)
{
if(!d[now]) return ;
d[now]=0;
if(l==r) return ;
int mid=(l+r)>>1;
rb(now*2,l,mid);
rb(now*2+1,mid+1,r);
} int main()
{
scanf("%d",&T);
for(T;T;T--)
{
B=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==-1) a[i]=i+1;
} for(int i=1;i<=n;i++)
{
k=ask(1,1,n+1,i+1);
if(k && a[k]<a[i])
{
B=1;
break;
}
ins(1,1,n+1,i,a[i]);
s[a[i]]++;
if(!k) continue;
ver[i]=k; s[k]++;
} if(!B)
{
for(int i=1;i<=n;i++) if(!s[i]) q.push(i);
k=0;
while(q.size())
{
int x=q.front(); q.pop();
s[ver[x]]--; s[a[x]]--;
if(!s[ver[x]]) q.push(ver[x]);
if(!s[a[x]]) q.push(a[x]);
t[x]=++k;
}
if(k!=n+1) B=1;
} if(B) printf("-1");
else for(int i=1;i<=n;i++) printf("%d ",t[i]);
printf("\n"); for(int i=1;i<=n+1;i++) t[i]=s[i]=ver[i]=a[i]=0;
rb(1,1,n+1);
}
}

CF1158C的更多相关文章

  1. 在$CF$水题の记录

    CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...

随机推荐

  1. 【mySQL】left join、right join和join的区别

    哈,好久没更新文章了,今天来说说关于mySQL那些年的小事.说到mySQL啊,用了挺久的了,但是有个问题一直在困扰着我,就是left join.join.right join和inner join等等 ...

  2. 如何访问 Redis 中的海量数据,服务才不会挂掉?

    来源:www.toutiao.com/i6697540366528152077 一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况 ...

  3. leetcode-350- 两个数组的交集 II

    问题: package com.example.demo; import java.util.ArrayList; import java.util.Arrays; import java.util. ...

  4. Java面试宝典(3)Java基础部分

    51.启动一个线程是用run()还是start()? . 启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关 ...

  5. console.log的另一种用法

    // console.log用法 var foo, bar; console.log(`foo's type: ${foo}`, `bar's type: ${bar}`); 输出:

  6. 箭头函数与普通function的区别

    1. 箭头函数没有自己的this,它里面的this是继承所属上下文中的this,而且使用call与apply都无法改变 let obj = { name: 'obj' } function fn1() ...

  7. ng2-file-upload插件在ionic3中的使用方法

    本文主要说明在ionic3中使用ng2-file-upload插件,上传多种类型文件(图片.word.excel.ppt.mp4等)的使用方法. 1.html代码: <button ion-bu ...

  8. APScheduler的简单记录

    此工具作为 定时任务调度 系统,在日常业务中经常使用,如定时获取第三方数据,定时清理数据 等等: 定时任务 和 业务逻辑 编写方式 一般有2种: 以 定时 清理db数据为例,在flask中,如下: 1 ...

  9. zabbix自带database monitor

    1. 在zabbix服务器上安装一下两个包: # yum -y install unixODBC mysql-connector-odbc 2. 修改zabbix服务器上ODBC配置: 2.1 Vim ...

  10. vue 项目中使用阿里巴巴矢量图标库iconfont

    原文:https://www.jianshu.com/p/38262f18eee2 1.打开iconfont阿里巴巴官网https://www.iconfont.cn 2.新建项目(这样方便后期维护图 ...