BZOJ1932 [Shoi2007]Setstack 集合堆栈机

妈呀。。。clj大爷太强啦!

原来还有set_union和set_intersection这种东西。。。

于是只要把栈顶的每个元素hash一下记录到一个vector里去就好了

 1 /**************************************************************
 2     Problem: 1932
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:148 ms
 7     Memory:3372 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <vector>
12 #include <stack>
13 #include <algorithm>
14
15 using namespace std;
16 typedef unsigned long long ull;
17 typedef vector <ull> vec;
18 const int N = 2e3 + 5;
19 const int base = 2333;
20
21 inline ull add(const vec &v) {
22     static ull res;
23     static int i;
24     for (i = res = 0; i < v.size(); ++i)
25         res *= base, res += v[i] + 101;
26     return res;
27 }
28
29 inline void get(vec &v) {
30     sort(v.begin(), v.end());
31     v.resize(unique(v.begin(), v.end()) - v.begin());
32 }
33
34 int n, top;
35 vec S[N];
36
37 int main() {
38     int i;
39     char st[15];
40     vec a, b, c(N);
41     scanf("%d",&n);
42     for (i = 1; i <= n; ++i) {
43         scanf("%s", st + 1);
44         if (st[1] == ‘P‘) {
45             S[++top] = vec();
46             goto end;
47         }
48         if (st[1] == ‘D‘) {
49             ++top, S[top] = S[top - 1];
50             goto end;
51         }
52         a = S[top--], b = S[top--];
53         if (st[1] == ‘A‘) {
54             b.push_back(add(a)), get(b);
55             S[++top] = b;
56             goto end;
57         }
58         c = vec(a.size() + b.size());
59         if (st[1] == ‘U‘) {
60             c.resize(set_union(a.begin(), a.end(), b.begin(), b.end(), c.begin()) - c.begin());
61             get(c), S[++top] = c;
62             goto end;
63         }
64         if (st[1] == ‘I‘) {
65             c.resize(set_intersection(a.begin(), a.end(), b.begin(), b.end(), c.begin()) - c.begin());
66             get(c), S[++top] = c;
67             goto end;
68         }
69         end : printf("%d\n", S[top].size());
70     }
71     return 0;
72 }

时间: 2024-07-28 23:46:55

BZOJ1932 [Shoi2007]Setstack 集合堆栈机的相关文章

【10.23更新】 程序员新手福利来了,Android项目源码集合,持续更新。。。

拼图游戏 使用服务:玩编程 功能分类:休闲游戏 支持平台:Android 运行环境: Android 开发语言:Java 开发工具:Eclipse 源码下载地址 :http://www.devstore.cn/code/info/259.html 拼图游戏运行界面: 仿糗事百科Android客户端源码 功能分类:社交            支持平台:Android 运行环境:Eclipse       开发语言:Java 开发工具:Eclipse        源码大小:4.62MB 源码下载地

游戏开发中的人工智能 复习

游戏开发中的人工智能 复习 (个人复习,一些仅是给自己的复习提示(=w=),转载注明出处:http://blog.csdn.net/hcbbt/article/details/42815479) 配套教材:游戏开发中的人工智能 知识点 移动 Bresenham,视线(略),拦截 // Bresenham if (deltaCol > deltaRow) { fraction = deltaRow * 2 - deltaCol; while (nextCol != endCol) { if (fr

Atitit.虚拟机与指令系统的设计

1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机1 1.1.1. 堆栈机1 1.1.2. 状态机2 2. 为什么状态机比堆栈机快呢?3 2.1. Stack based vm的指令 范例4 3. 参考5 1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机 有了上面的基础只是,我们就知道,堆栈机和状态机不过是两种不同的图灵完整的计算模型而已. 1.1.1. 堆栈机 所谓堆栈机,就是计算机的状态是存在于堆栈之中,通过对堆栈中的元素进行运算和调整,来实现计算功能的计算机. 例如,要进

先贴一段上学时候写的代码占个位

C#计算器 using System; using System.Collections.Generic; using System.Linq; namespace System { /// <summary> /// 计算器类 /// </summary> public class Calculator { string strFormula; /// <summary> /// 用一个字符串表达式初始化实例. /// </summary> /// <

Lua1.1 Lua 的设计和实现 (二)

转载出处:http://my.oschina.net/xhan/blog/309615 (接上篇) -------------------------------------- 实现 -------------------------------------- 扩展语言总是由应用程序以某种方式解释执行的.简单的扩展语言可以直接从源代码进行解释执行.另一方面,嵌入式语言通常是强大的编程语言,具有复杂的语法和语义.一个更有效的嵌入式语言实现技术是设计适合语言需求的虚拟机,编译扩展程序成虚拟机的字节码

[译]Python编写虚拟解释器

使用Python编写虚拟机解释器 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: 1. LX终端(LXTerminal):Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令2. GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 3. 环境使用 使用R语言交互式环境输入实验所需的代码及文件,使用LX终端(LXTermina

如何自创一门计算机语言

需要有基本的编译原理常识.构造基本的编译原理常识,一方面来自于对已有语言的使用经验,了解基本术语.比如用C,那么起码知道语言要素包括宏.表达式.语句.语句块.函数.指针等:还知道C语言有编译.链接和执行三个阶段.这些基本概念对宏观掌握学习进程是很有必要的.另外一方面编译原理的常识,要来自图书.比如龙书.SICP.在这一步,得知道大部分语言的处理都要分为词法.语法.语义和代码生成四个阶段.每个阶段,分别是做什么的. 了解具体的编译算法.了解到什么程度,取决于使用第三方工具,还是需要自己从字符开始处

第4章 序列的应用

第4章 序列的应用 4.1序列 序列是一块用于存放多个值的连续内存空间,并且按上一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以取出相应的值.例如,我们可以把一家酒店看作一个序列,那么酒店里的每个房间都可以看作是这个序列的元素.而房间号就相当于索引,可以通过房间号找到对应的房间. 在Python中,序列结构主要有列表.元组.集合.字典和字符串,对于这些序列结构有以下几个通用的操作.其中,集合和字典不支持索引.切片.相加和相乘操作. 4.1.1索引 序列中的每一个元

python并发编程(一):多线程,多进程

'''多进程(线程)编程: 1. 进程和线程 2. 并发与并行 3. 同步和异步 4. 阻塞和非阻塞 5. 进程/线程的调度模型''' # 综述 '''进程和线程: 1. 进程: 1) 是一个程序在数据集上的一次动态执行过程 2) 由程序, 数据集, 进程控制模块组成 2. 线程: 1) 是CPU的一个最小执行单元, 2) 线程的出现是为了降低进程间切换的消耗 3) 实现在一个进程内的并发 4) 由线程ID, 程序计数器, 寄存器集合, 堆栈组成 3. 进程和线程的关系: 1) 进程是线程的容器