zoukankan      html  css  js  c++  java
  • UVA 12096 The SetStack Computer

    题目链接:https://vjudge.net/problem/UVA-12096

    题目翻译摘自《算法禁赛入门经典》

    题目大意

      有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且支持以下操作。

    1. PUSH:空集“{}”入栈。
    2. DUP:把当前栈顶元素复制一份后再入栈。
    3. UNION:出栈两个集合,然后把二者的并集入栈。
    4. INTERSECT:出栈两个集合,然后把二者的交集入栈。
    5. ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。

      每次操作后,输出栈顶集合的大小(即元素个数)。

      输入不超过2000个操作,并且保证操作均能顺利进行(不需要对空栈执行出栈操作)。

    分析

      这题用到一个技巧,把遇到的每个集合都存起来,然后给它一个 id,用的时候按照 id 来找集合,这样能大大减少空间占用,效率也能大大提升。

    代码如下

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3  
      4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      5 #define Rep(i,n) for (int i = 0; i < (n); ++i)
      6 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
      7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
      8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
      9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
     10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
     11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
     12  
     13 #define pr(x) cout << #x << " = " << x << "  "
     14 #define prln(x) cout << #x << " = " << x << endl
     15  
     16 #define LOWBIT(x) ((x)&(-x))
     17  
     18 #define ALL(x) x.begin(),x.end()
     19 #define INS(x) inserter(x,x.begin())
     20  
     21 #define ms0(a) memset(a,0,sizeof(a))
     22 #define msI(a) memset(a,inf,sizeof(a))
     23 #define msM(a) memset(a,-1,sizeof(a))
     24 
     25 #define MP make_pair
     26 #define PB push_back
     27 #define ft first
     28 #define sd second
     29  
     30 template<typename T1, typename T2>
     31 istream &operator>>(istream &in, pair<T1, T2> &p) {
     32     in >> p.first >> p.second;
     33     return in;
     34 }
     35  
     36 template<typename T>
     37 istream &operator>>(istream &in, vector<T> &v) {
     38     for (auto &x: v)
     39         in >> x;
     40     return in;
     41 }
     42  
     43 template<typename T1, typename T2>
     44 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
     45     out << "[" << p.first << ", " << p.second << "]" << "
    ";
     46     return out;
     47 }
     48 
     49 inline int gc(){
     50     static const int BUF = 1e7;
     51     static char buf[BUF], *bg = buf + BUF, *ed = bg;
     52     
     53     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
     54     return *bg++;
     55 } 
     56 
     57 inline int ri(){
     58     int x = 0, f = 1, c = gc();
     59     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
     60     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
     61     return x*f;
     62 }
     63 
     64 template<class T>
     65 inline string toString(T x) {
     66     ostringstream sout;
     67     sout << x;
     68     return sout.str();
     69 }
     70  
     71 typedef long long LL;
     72 typedef unsigned long long uLL;
     73 typedef pair< double, double > PDD;
     74 typedef pair< int, int > PII;
     75 typedef pair< int, PII > PIPII;
     76 typedef pair< string, int > PSI;
     77 typedef pair< int, PSI > PIPSI;
     78 typedef set< int > SI;
     79 typedef set< PII > SPII;
     80 typedef vector< int > VI;
     81 typedef vector< VI > VVI;
     82 typedef vector< SI > VSI;
     83 typedef vector< PII > VPII;
     84 typedef map< int, int > MII;
     85 typedef map< int, string > MIS;
     86 typedef map< int, PII > MIPII;
     87 typedef map< PII, int > MPIII;
     88 typedef map< string, int > MSI;
     89 typedef map< string, string > MSS;
     90 typedef map< PII, string > MPIIS;
     91 typedef map< PII, PII > MPIIPII;
     92 typedef multimap< int, int > MMII;
     93 typedef multimap< string, int > MMSI;
     94 //typedef unordered_map< int, int > uMII;
     95 typedef pair< LL, LL > PLL;
     96 typedef vector< LL > VL;
     97 typedef vector< VL > VVL;
     98 typedef priority_queue< int > PQIMax;
     99 typedef priority_queue< int, VI, greater< int > > PQIMin;
    100 const double EPS = 1e-10;
    101 const LL inf = 0x7fffffff;
    102 const LL infLL = 0x7fffffffffffffffLL;
    103 const LL mod = 1e9 + 7;
    104 const int maxN = 1e3 + 7;
    105 const LL ONE = 1;
    106 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
    107 const LL oddBits = 0x5555555555555555;
    108 
    109 int T, N;
    110 string op; 
    111 MSI op_id = {MP("PUSH", 0), MP("DUP", 1), MP("UNION", 2), MP("INTERSECT", 3), MP("ADD", 4)};
    112 map< SI, int > set_id;
    113 VSI elements;
    114 stack< int > st;
    115 
    116 void INSERT(SI &x) {
    117     if(set_id.find(x) == set_id.end()) {
    118         st.push(elements.size());
    119         set_id[x] = elements.size();
    120         elements.PB(x);
    121     }
    122     else st.push(set_id[x]);
    123 }
    124 
    125 void PUSH() {
    126     st.push(0);
    127 }
    128 
    129 void DUP() {
    130     st.push(st.top());
    131 }
    132 
    133 void UNION() {
    134     int x = st.top(); st.pop();
    135     int y = st.top(); st.pop();
    136     SI z;
    137     
    138     set_union(ALL(elements[x]), ALL(elements[y]), INS(z));
    139     
    140     INSERT(z);
    141 }
    142 
    143 void INTERSECT() {
    144     int x = st.top(); st.pop();
    145     int y = st.top(); st.pop();
    146     SI z;
    147     
    148     set_intersection(ALL(elements[x]), ALL(elements[y]), INS(z));
    149     
    150     INSERT(z);
    151 }
    152 
    153 void ADD() {
    154     int x = st.top(); st.pop();
    155     int y = st.top(); st.pop();
    156     SI z = elements[y];
    157     
    158     z.insert(x);
    159     
    160     INSERT(z);
    161 }
    162 
    163 void (*func[5])() = {PUSH, DUP, UNION, INTERSECT, ADD};
    164 
    165 int main(){
    166     //freopen("MyOutput.txt","w",stdout);
    167     //freopen("input.txt","r",stdin);
    168     //INIT();
    169     cin >> T;
    170     elements.PB(SI());
    171     set_id[SI()] = 0;
    172     
    173     while(T--) {
    174         cin >> N;
    175         st = stack< int >();
    176         
    177         Rep(i, N) {
    178             cin >> op;
    179             func[op_id[op]]();
    180             cout << elements[st.top()].size() << endl;
    181         }
    182         cout << "***
    ";
    183     }
    184     return 0;
    185 }
    View Code
  • 相关阅读:
    与众不同 windows phone (50)
    与众不同 windows phone (49)
    重新想象 Windows 8.1 Store Apps (93)
    重新想象 Windows 8.1 Store Apps 系列文章索引
    重新想象 Windows 8.1 Store Apps (92)
    重新想象 Windows 8.1 Store Apps (91)
    重新想象 Windows 8.1 Store Apps (90)
    重新想象 Windows 8.1 Store Apps (89)
    重新想象 Windows 8.1 Store Apps (88)
    重新想象 Windows 8.1 Store Apps (87)
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11051670.html
Copyright © 2011-2022 走看看