• HDU 5063 Operation the Sequence(暴力 数学)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5063


    Problem Description
    You have an array consisting of n integers: a1=1,a2=2,a3=3,,an=n. Then give you m operators, you should process all the operators in order. Each operator is one of four types:
    Type1: O 1 call fun1();
    Type2: O 2 call fun2();
    Type3: O 3 call fun3();
    Type4: Q i query current value of a[i], this operator will have at most 50.
    Global Variables: a[1…n],b[1…n];
    fun1() {
    index=1;
      for(i=1; i<=n; i +=2) 
        b[index++]=a[i];
      for(i=2; i<=n; i +=2)
        b[index++]=a[i];
      for(i=1; i<=n; ++i)
        a[i]=b[i];
    }
    fun2() {
      L = 1;R = n;
      while(L<R) {
        Swap(a[L], a[R]); 
        ++L;--R;
      }
    }
    fun3() {
      for(i=1; i<=n; ++i) 
        a[i]=a[i]*a[i];
    }
     
    Input
    The first line in the input file is an integer T(1T20), indicating the number of test cases.
    The first line of each test case contains two integer n(0<n100000)m(0<m100000).
    Then m lines follow, each line represent an operator above.
     
    Output
    For each test case, output the query values, the values may be so large, you just output the values mod 1000000007(1e9+7).
     
    Sample Input
    1 3 5 O 1 O 2 Q 1 O 3 Q 1
     
    Sample Output
    2 4
     
    Source

    PS:

    把全部的操作存下来,每次把操作逆回去算一遍,求出在最初在数列中的位置。输出就可以!


    操作3是能够最后操作的!

    代码例如以下:

    #include <cstdio>
    #include <cstring>
    const int maxn = 100017;
    const int mod = 1000000007;
    typedef __int64 LL;
    int a[maxn], b[maxn];
    int n, m;
    int find_pos(int l, int p)
    {
        for(int i = l; i > 0; i--)
        {
            if(b[i] == 1)
            {
                if (p > (n + 1) / 2)
                    p = (p - (n + 1) / 2) * 2;
                else
                    p = (p - 1) * 2 + 1;
            }
            else
                p = n-p+1;
        }
        return p;
    }
    int main()
    {
        int t;
        char s[2];
        int p;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            int k = 0, l = 0;
            for(int i = 1; i <= m; i++)
            {
                scanf("%s%d",s,&p);
                if(s[0] == 'O')
                {
                    if(p == 3)
                        k++;
                    else
                        b[++l] = p;
                }
                else
                {
                    LL ans = find_pos(l,p);
                    for(int i = 1; i <= k; i++)
                    {
                        ans = ans*ans%mod;
                    }
                    printf("%I64d
    ",ans);
                }
            }
        }
        return 0;
    }
    



  • 相关阅读:
    博客园发展,我也来谈谈
    为什么说JavaScript是基于对象的语言?
    Email地址加密JS版
    Flash上传文件(结合asp.net)
    软件测试工程师面试题
    asp.net 创建文件夹时出错:未找到路径“D:\”的一部分。(asp.net 使用 FSO)
    发布一个可用在Blog上的Flash Mp3 Player (也支持flv格式)
    一直没掌握的一个简单的Update语句
    句柄的理解(选摘)
    消息的基本概念
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6961468.html
Copyright © 2020-2023  润新知