2021牛客多校第二场 K——Stack

题目大意

有一个单调栈,你需要往里面放 n n n 个数,这些数是一个排列。你要保证,放入第 p p p 个数的时候单调栈的大小为 x x x

解题思路

对于没有指定大小的地方,我们可以认为此时的大小为前一个位置大小加一,即 b [ i ] = b [ i − 1 ] + 1 b[i] = b[i-1] + 1 b[i]=b[i1]+1,显然,我们后面一个数不能与前一个数之差大于1,这样会导致中间缺少元素可放,最后我们倒着模拟一遍栈即可得出答案。

Code

#include <bits/stdc++.h>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
using namespace std;
const int MAXN = 2e6 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int st[MAXN], b[MAXN];
int ans[MAXN];
void solve(){
	int n, k;
	cin >> n >> k;
	for(int i = 1; i <= k; i++){
		int p, x;
		cin >> p >> x;
		b[p] = x;
	}
	for(int i = 1; i <= n; ++i){
		if(!b[i]) b[i] = b[i-1] + 1;
	}
	for (int i = 1; i <= n-1; ++i){
	    if(b[i+1] - b[i] > 1){
			cout << -1 << endl;
			return;
		}
	}
	int cnt = 0, tot = 0;
	for(int i = n; i >= 1; --i){
		while(b[i] > tot) st[++tot] = ++cnt;
		ans[i] = st[tot--];
	}
	for(int i = 1; i <= n; ++i)
		cout << ans[i] << " ";
	cout << endl;
}

int main()
{
    #ifdef ONLINE_JUDGE
    #else
       freopen("in.txt", "r", stdin);
       freopen("out.txt", "w", stdout);
    #endif

    qc;
    int T;
    // cin >> T;
    T = 1;
    while(T--){

        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值