zoukankan      html  css  js  c++  java
  • 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;
    }
    



  • 相关阅读:
    c/c++指针
    C++小思
    gvim-ide plugins
    Windows下文件的所有和权限
    C++枚举类型
    linux的cgroup控制
    linux的free命令
    linux下可以禁用的一些服务
    bat programming is easy and powerful
    c++类定义代码的分离
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6961468.html
Copyright © 2011-2022 走看看