URAL 2019 Pair: normal and paranormal (STL栈)

题意:在一个半圆内,有2*n个点,其中有大写字母和小写字母。其中你需要连接大写字母到小写字母,其中需要保证这些连接的线段之间没有相交。

如果能够实现,将大写字母对应的小写字母的序号按序输出。

析:我把它看成一个括号序列,然后用栈解决即可。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#define debug() puts("++++");
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e16;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c){
  return r >= 0 && r < n && c >= 0 && c < m;
}

struct Node{
  char ch;
  int id;
};
map<int, int> mp;
stack<Node> st;

int main(){
  string s;
  cin >> n >> s;
  int up = 1, lo = 1;
  for(int i = 0; i < s.size(); ++i){
    if(st.empty()){
      if(islower(s[i]))  st.push((Node){s[i], lo++});
      else st.push((Node){s[i], up++});
    }
    else if(islower(s[i])){
      if(s[i] == st.top().ch + 32)  mp[st.top().id] =  lo++, st.pop();
      else  st.push((Node){s[i], lo++});
    }
    else{
      if(s[i] + 32 == st.top().ch)  mp[up++] = st.top().id, st.pop();
      else  st.push((Node){s[i], up++});
    }
  }
  if(!st.empty()){ puts("Impossible");  return 0; }
  for(map<int, int> :: iterator it = mp.begin(); it != mp.end(); ++it)
    if(it == mp.begin())  printf("%d", it->second);
    else  printf(" %d", it->second);
  printf("\n");
  return 0;
}

  

时间: 2024-10-14 00:43:30

URAL 2019 Pair: normal and paranormal (STL栈)的相关文章

ural 2019 Pair: normal and paranormal

2019. Pair: normal and paranormal Time limit: 1.0 secondMemory limit: 64 MB If you find yourself in Nevada at an abandoned nuclear range during Halloween time, you’ll become a witness of an unusual show. Here Ghostbusters hold annual tests for new ve

URAL 2019 Pair: normal and paranormal (贪心) -GDUT联合第七场

比赛题目链接 题意:有n个人每人拿着一把枪想要杀死n个怪兽,大写字母代表人,小写字母代表怪兽.A只能杀死a,B只能杀死b,如题目中的图所示,枪的弹道不能交叉.人和怪兽的编号分别是1到n,问是否存在能全部杀死的情况,如果存在则输出编号1到n的每个人杀死的怪兽的编号,如果不能输出"Impossible". 题解:贪心,用递归实现,判断相邻的是否能构成一对,优先构成相邻的,如果不能就递归到前面看是否能构成一对即可. #include<cstdio> #include<cst

Gym 100507H - Pair: normal and paranormal

题目链接:http://codeforces.com/gym/100507/attachments ---------------------------------------------------------------------------- 刚看这题的时候感觉是区间$DP$ 然而复杂度一直停留在$O(n^3)$优化不下来 后来又瞎试了一些贪心 都在较大的数据上挂掉了 反复琢磨着大写字母和相应小写字母匹配 便想到了以前做过的括号匹配 只不过此题大写字母和小写字母的左右关系是不限制的 因

2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal

题目链接:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定一个长度为2n,由n个大写字母和n小写字母组成的字符串,将对应的字母两两连接,且不相交,按顺序输出没个大写字母对应的小写字母的位置,如果不存在则输出"Impossible" 样例: /home/destr/Desktop/深度截图_选择区域_20181006175058.png /home/destr/Desktop/深

STL栈、队列、优先队列—————基础知识

0基本特点:后进先出(LIFO) 注意: 不一定最先进栈的最后出栈,只要保证是栈顶元素出栈就行! 当栈中存在一个元素时,top=0,因此通常把空栈的判定条件定为top= - 1: STL 中栈的使用方法: 头文件:#include <stack> 基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第一个元素(栈顶元素) size() 返回栈中的元素个数 empty() 当栈为空时,返回 true STL 中队列的使用(

c++STL(栈、队列)

栈stack -先入后出FILO 栈可以理解为一个坑,先掉坑里的被压在下面,等上面的走了才能出来 头文件 <stack> 入栈 push(某东西); 栈顶元素出栈 pop(); 是否为空 empty();  空返回1  非空返回0 大小 size(); 返回元素个数 查看栈顶(只是查看,下面的也一样) top(); 返回栈顶元素  //如果栈是空的再看栈顶元素就要出事咯 队列 -先入先出FIFO 头文件 <queue> 入队 push(某东西); 出队 pop(); 查看队首 fr

转:C++ STL 栈和队列

使用标准库的栈和队列时,先包含相关的头文件 #include<stack> #include<queue> 定义栈如下: stack<int> stk; 定义队列如下: queue<int> q; 栈提供了如下的操作 s.empty()             如果栈为空返回true,否则返回false s.size()                返回栈中元素的个数 s.pop()                 删除栈顶元素但不返回其值 s.top()

HDU 1022 Train Problem I (STL 栈模拟)

Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30420    Accepted Submission(s): 11492 Problem Description As the new term comes, the Ignatius Train Station is very busy nowaday

UVa 1596 Bug Hunt (STL栈)

题意:给定两种操作,一种是定义一个数组,另一种是赋值,让你找出哪一步时出错了,出错只有两种,一种是数组越界,另一种是访问未定义变量. 析:当初看到这个题时,感觉好麻烦啊,然后就放过去了,而现在要重新回来做一下,感觉也不好做,做了1个多小时..... 现在分析一下是思路,我觉得我想的比较麻烦,我首先定义了两个map,分别是数组的最大长度和数组的,赋值情况,然后用向量把所有操作存起来, 在定义时很简单,直接把长度赋给map就行,麻烦就是在这个赋值时,首先是把等号两边的分开,先计算等号右边的操作,主要