zoukankan      html  css  js  c++  java
  • codeforces 1435 D. Shurikens (贪心)

    题目链接:https://codeforces.com/contest/1435/problem/D

    考虑维护一个栈,对于每一个封闭的栈,出栈的(cost)的顺序必须是递增的,否则必然不满足条件
    那么就维护与当前元素(i)形成封闭栈的元素的位置(pos[i]),(a_i)就是第 (pos[i]) 个进栈的元素
    最后检查一下是否每个封闭栈中元素大小都单调即可

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 200100;
    
    int n,cnt;
    int a[maxn],pos[maxn],op[maxn],ans[maxn];
    int sta[maxn],tail = 0;
    
    char s[10];
    
    priority_queue<int,vector<int>,greater<int> > q;
    
    ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
    
    int main(){
    	n = read();
    	int x; int cnt = 0; int tot = 0; int flag = 0;
    	for(int i=1;i<=2 * n;++i){
    		scanf("%s",s);
    		if(s[0]=='+'){
    			op[i] = 0;
    			sta[++tail] = ++cnt;
    		}else{
    			op[i] = 1;
    			if(!tail){
    				flag = 1;
    				break;
    			}
    			a[++tot] = read();
    			pos[tot] = sta[tail--];
    		}
    	}
    	
    	if(!flag){
    		cnt = 0; tot = 0;
    		for(int i=1;i<=n;++i) ans[pos[i]] = a[i];
    		for(int i=1;i<=2 * n;++i){
    			if(!op[i]){
    				q.push(ans[++cnt]);
    			}else{
    				if(a[++tot] != q.top()){
    					flag = 1;
    					break;
    				}else{
    					q.pop();
    				}
    			}
    		}
    	}
    	
    	if(flag){
    		printf("NO
    ");
    	}else{
    		printf("YES
    ");
    		for(int i=1;i<=n;++i){
    			printf("%d ",ans[i]);
    		}printf("
    ");
    	}
    	
    
    	return 0;
    }
    
  • 相关阅读:
    webService基本概念、元素及简单编码实现
    云服务器、vps、虚拟主机的区别
    SOAP和WSDL的一些必要知识
    密码学基础
    oracle执行计划
    dubbo学习笔记:快速搭建
    dubbo和zookeeper的关系
    查看wifi密码
    自动保存图表
    自定义颜色
  • 原文地址:https://www.cnblogs.com/tuchen/p/13876040.html
Copyright © 2011-2022 走看看