zoukankan      html  css  js  c++  java
  • URAL 1992

    CVS

    Description

    Yoda: Visit I will the cloners on Kamino... And see this army they have created for the Republic.
    Cloners from the Kamino planet breed some of the finest clones. Such good results are due to the careful management over the clones’ evolution. The Kaminuans are now busy working out a new study technology that lets increase the clones’ effectiveness. The cloners have come up with a new control system CVS (Clone Version System) that makes managing the progress of experiments easier. The system is quite simple to use.
    The Kaminuans have some set of educational programs at their disposal. A clone’s effectiveness depends on which programs and in which order he has learned. The Kaminuans can teach any clone a program as long as this clone hasn’t learned it already.
    To make the experiments even easier to conduct, the Kaminuans enabled canceling the changes made by the last program the clone has learned. In this case, the clone’s knowledge returns to the level when the program hasn’t yet been studied. Then this clone can study this program in the future. You can cancel programs at any time unless the clone is at the basic knowledge level.
    Besides the ‘roll back’ function, a clone can ‘re-learn’ a program. If one cancels some program by mistake, he can cancel the cancellation. The CVS keeps record of each clone’s canceled programs. After a program is canceled, the CVS adds another record. After a clone re-learn a program, the record is deleted. If a clone learn (not relearn) a program, all cancellation record history of this clone is deleted. You can use the re-learn function as long as the record history for this clone contains any records.
    Finally, the system has a ‘clone’ option. If a Kaminuan likes the current variant of a clone, he can clone the clone, that is, create a new clone with the same sequence of taught programs and cancellation history.
    Initially the Kaminuans have a single clone with basic knowledge. Help them analyze the progress of the experiments.

    Input

    The first line of the input contains numbers n — the number of queries — and m — the number of educational programs (1 ≤ nm ≤ 5·10 5). Each of the following n lines has one of the formats given below.
    • learn ci pi. Teach clone ci program pi (1 ≤ pi ≤ m).
    • rollback ci. Cancel the last learned program for clone ci.
    • relearn ci. Apply ‘re-learn’ function to clone ci.
    • clone ci. Clone the clone ci.
    • check ci. Display the last program clone ci has learned and knows at the moment.
    It is guaranteed that rollback won’t be applied to the clone that is at the basic knowledge level. learn is always applied with the program a clone doesn’t already know. relearn is only applied if the cancellation history of a clone is not empty. It is also guaranteed that only the clones that already exist can occur in the queries. The numbers are assigned to the clones in the order the clones appear. The Kaminuans started their experiments from clone number one.

    Output

    For each check  ci query display the result on a single line. If some clone has only basic knowledge, print basic, otherwise print the number of the last learned program.

    Sample Input

    inputoutput
    9 10
    learn 1 5
    learn 1 7
    rollback 1
    check 1
    clone 1
    relearn 2
    check 2
    rollback 1
    check 1
    
    5
    7
    basic
    
     
    题目值得一做
    解析:
    通过两个线性表来实现前进后退操作。
     
    #include <cstdio>
    #include <iostream>
    #define N 500005
    using namespace std;
    int now[N],tot_ro,c,p;
    int stack[N],pre[N],tot;
    int stack_ne[N],now_ne[N],next[N],tot_ne;
    char order[100];
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF){
            tot=tot_ne=0;
            tot_ro=1;
            now[1]=now_ne[1]=0;
            for(int i=0; i<n; i++){
                scanf("%s",order);
                switch (order[4]) {
                    case 'n'://learn
                        scanf("%d%d",&c,&p);
                        stack[++tot]=p;
                        pre[tot]=now[c];
                        now[c]=tot;
                        now_ne[c]=0;
                        break;
                    case 'b'://rollback
                        scanf("%d",&c);
                        if(now[c]!=0){
                            stack_ne[++tot_ne]=stack[now[c]];
                            next[tot_ne]=now_ne[c];
                            now_ne[c]=tot_ne;
                            now[c]=pre[now[c]];
                        }
                        break;
                    case 'a'://relearn
                        scanf("%d",&c);
                        if(now_ne[c]!=0){
                            stack[++tot]=stack_ne[now_ne[c]];
                            pre[tot]=now[c];
                            now[c]=tot;
                            now_ne[c]=next[now_ne[c]];
                        }
                        break;
                    case 'e'://clone
                        scanf("%d",&c);
                        if(c<=tot_ro){
                            now[++tot_ro]=now[c];
                            now_ne[tot_ro]=now_ne[c];
                        }
                        break;
                    case 'k'://check
                        scanf("%d",&c);
                        if(now[c]==0)
                            printf("basic
    ");
                        else 
                            printf("%d
    ",stack[now[c]]);
                        break;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    Leetcode 122. Best Time to Buy and Sell Stock II
    Leetcode 337. House Robber III
    Leetcode 213. House Robber II
    java 常用正则表达式总结
    eclipse异常解决:Errors occurred during the build.........
    关于匿名内部类的理解!
    接口/抽象类的思考
    IO流对文件的读取操作
    标准类的建立,以及用集合对标准类中的元素进行存取操作
    利用集合进行对元素的添加和删除
  • 原文地址:https://www.cnblogs.com/Mathics/p/3873877.html
Copyright © 2011-2022 走看看