hdu 5063 Operation the Sequence(Bestcoder Round #13)「建议收藏」

hdu 5063 Operation the Sequence(Bestcoder Round #13)

大家好,又见面了,我是全栈君。

Operation the Sequence

                                                                    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                                            Total Submission(s): 158    Accepted Submission(s): 74




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

 

官方题解
注意到查询次数不超过50次。那么能够从查询位置逆回去操作,就能够发现它在最初序列的位置,再逆回去就可以
求得当前查询的值。对于一组数据复杂度约为O(50*n)。

ps:记两个操作数组a和c,数组a存的是奇偶排序的上一个元素的位置,数组c存的是逆置操作的上一个元素的位置,这样就能够逆回去操作了。


  代码:

//218ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100000+1000;
int a[maxn];//奇偶排序操作
int q[maxn];//存储操作类型,1是奇偶排序。2是逆置
int c[maxn];//逆置
const int mod=1000000007;
int solve(int cur,int x)//找到在刚開始的位置
{
    int ans=x;
    for(int i=cur-1;i>=0;i--)
    {
        if(q[i]==1)
        {
           ans=a[ans];
        }
        else
        {
            ans=c[ans];
        }
    }
    return ans;
}
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
       int index=1;
       for(int i=1; i<=n; i +=2)
       a[index++]=i;
       for(int i=2; i<=n; i +=2)
        a[index++]=i;
       for(int i=1;i<=n;i++)
       c[i]=n+1-i;
        char s[10];
        int p;
        int cur=0;
        int cou=0;
        for(int i=0;i<m;i++)
        {
            scanf("%s%d",s,&p);
            if(s[0]=='O')
            {
                if(p==3)
                cou++;
                else
                q[cur++]=p;
            }
            else
            {
                long long ans=solve(cur,p);

                for(int i=0;i<cou;i++)
                {
                    ans=ans*ans%mod;
                }
                printf("%I64d\n",ans);
            }
        }
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115774.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js书写规范

    js书写规范

    2020年11月19日
    181
  • C++条件运算符_位运算符

    C++条件运算符_位运算符C++条件运算符(?:)的通用格式如下:表达式1?表达式2:表达式3说明:如果表达式1为true,则整个表达式的值为表达式2的值(即,冒号左边的值);如果表达式1为false,则整个表达式的值为表达式3的值(即,冒号右边的值);C++中,条件运算符(?:)是唯一需要3个操作数的运算符。下面举个简单的例子进行说明例如:(1) inta=1; int…

    2022年10月2日
    2
  • 【用户画像】从0到1掌握用户画像知识体系

    【用户画像】从0到1掌握用户画像知识体系一、初始用户画像1.1用户画像随着用户的一切行为数据可以被企业追踪到,企业的关注点日益聚焦在如何利用大数据为经营分析和精准营销服务,而要做精细化运营,首先要建立本企业的用户画像。提到用户画像的概念,我们区分下用户角色(Persona)和用户画像(Profile):1.1.1用户角色用户角色本质是一个用以沟通的工具,当我们讨论产品、需求、场景、用户体验的时候,为了避免在目标用户理解上的分歧,用户角色应运而生。用户角色建立在对真实用户深刻理解,及高精准相关数据的概括之上,虚构的包含典型用

    2022年5月25日
    97
  • 三菱数据移位指令_三菱plc循环与移位指令

    三菱数据移位指令_三菱plc循环与移位指令一、实训任务1、循环移位指令编程:控制要求:应用循环右移指令(ROR)编写8灯循环点亮程序。Y0~Y7分别控制8盏灯,按启动按钮X0后,Y0亮1S→Y0灭、Y1亮1S→Y1灭、Y2亮1S→……→Y7灭、Y0亮周而复始运行,按停止按钮X1后,灯全灭。编写并运行程序,写出运行结果。2、位移位指令编程:控制要求:应用位左移指令(SFTL)编写8灯点亮程序。Y10~Y17分别控制8…

    2022年6月7日
    126
  • vue父组件调用子组件属性_vue子组件获取父组件实例

    vue父组件调用子组件属性_vue子组件获取父组件实例在vue2中,子组件调用父组件,直接使用this.$emit()即可。但是在vue3中,很显然使用this.$emit()已经开始报错了,为什么会报错呢?原因是:在vue3中setup是在声明周期beforeCreate和created前执行,此时vue对象还未创建,因此我们无法使用this。那么我们在vue3中,子组件该如何调用父组件的函数呢?方法一:首先写一个Child.vue,重点在setup函数中引入context形参,配合emit使用。定义了两个函数,toFather

    2022年9月28日
    2
  • IntelliJ IDEA中怎么全局搜索替换(整个项目)(Eclipse)

    IntelliJ IDEA中怎么全局搜索替换(整个项目)(Eclipse)IntelliJIDEA使用教程(总目录篇)我们用Eclipse或者IntelliJIDEA编程,有时候需要将整个项目的某个字符串替换成其他的。全局搜索我会,我还给调成ctrl+g了呢,但是遇到要全局(整个项目)替换字符串。哎哟,我有点蒙了。这不换了编辑器吗。我用的是eclipse的keymap而且电脑又不是mac。那么问题来啦。怎么找快捷键呢。如下;额,顺便说下…

    2025年6月9日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号