HDU 5063 Operation the Sequence(BestCoder Round #13)

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(1≤T≤20), indicating the number of test cases.
The first line of each test case contains two integer n(0<n≤100000), m(0<m≤100000).
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

题意:给出三种操作,第一种是将奇数序的数提前,偶数序的数滞后,第二种是前后对称互换位置,第三种是每一位求取平方。

解题思路:

    因为给定n和m都是100000,我们每一步都做具体的操作,时间将是O(n*m),肯定超时。最开始的时候

我怎么想都不知道怎么解决。以为是线段树。询问Q i最多50次。所以我们把每部的操作都记下来,每次Q i的时候,

就反推回去。自己可以推推。假设当前位置为x,我们要求操作之前的位置。

Fun1:

n = (n + 1) / 2;

x = x <= n / 2 ? (2 * x - 1) : ((x - n) * 2);

Fun2:

x = n + 1 - x;

Fun3:

我们用op记录平方次数。这样处理的时间复杂度O(50*n)。

#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

const int N=1e5+10;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;

typedef long long LL;

int a[N], ope[N], k;

int Fun1(int x, int n)
{
    n = (n+1)/2;

    if (x <= n) return 2*x-1;
    return (x-n)*2;
}

int Fun2(int x, int n)
{
    return n+1-x;
}

void Solve(int x, int n)
{
    int i, op = 0;
    LL num;

    for (i = k-1; i >= 0; i--)
    {
        if (ope[i] == 1) x = Fun1(x, n);
        else if (ope[i] == 2) x = Fun2(x, n);
        else op++;
    }

    num = x;
    for (i = 1; i <= op; i++)
        num = num * num % MOD;

    printf("%lld\n", num);
}

int main ()
{
    int T, n, m, x, i;
    char s[10];

    scanf("%d", &T);

    while (T--)
    {
        scanf("%d%d", &n, &m);

        k = 0;

        for (i = 1; i <= n; i++) a[i] = i;

        while (m--)
        {
            scanf("%s %d", s, &x);

            if (s[0] == ‘O‘) ope[k++] = x;
            else Solve(x, n);
        }
    }

    return 0;
}
时间: 2024-08-09 22:00:44

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

HDU 5063 Operation the Sequence(仔细审题)

http://acm.hdu.edu.cn/showproblem.php?pid=5063 题目大意: 题目意思还是比较简单.所以就不多少了.注意这句话,对解题有帮助. Type4: Q i query current value of a[i], this operator will have at most 50. 解题思路: 因为给定n和m都是100000,我们每一步都做具体的操作,时间将是O(n*m),肯定超时.最开始的时候 我怎么想都不知道怎么解决.以为是线段树.比赛完了以后,看了解

hdu 5204 Rikka with sequence(BestCoder Round #37)

Rikka with sequence                                                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 378    Accepted Submission(s): 75 Problem Description As we know, Rikk

HDU 5805 - NanoApe Loves Sequence (BestCoder Round #86)

先找相邻差值的最大,第二大,第三大 删去端点会减少一个值, 删去其余点会减少两个值,新增一个值,所以新增和现存的最大的值比较一下取最大即可 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 #define LL long long 6 const int N = 100005; 7 int t, n, p1, p2, p3; 8 LL a[N]; 9

HDU 5806 - NanoApe Loves Sequence Ⅱ (BestCoder Round #86)

若 [i, j] 满足, 则 [i, j+1], [i, j+2]...[i,n]均满足 故设当前区间里个数为size, 对于每个 i ,找到刚满足 size == k 的 [i, j], ans += n - j + 1 . i++ 的时候看看需不需要size-- 就可以更新了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define

HDU 4932 Miaomiao&#39;s Geometry(BestCoder Round #4)

Problem Description: There are N point on X-axis . Miaomiao would like to cover them ALL by using segments with same length. There are 2 limits: 1.A point is convered if there is a segments T , the point is the left end or the right end of T.2.The le

HDU 5063 Operation the Sequence(暴力)

HDU 5063 Operation the Sequence 题目链接 把操作存下来,由于只有50个操作,所以每次把操作逆回去运行一遍,就能求出在原来的数列中的位置,输出即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100005; const ll MOD = 100000

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: T

hdu 5062 Beautiful Palindrome Number(Bestcodeer Round #13)

Beautiful Palindrome Number                                                                 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 116    Accepted Submission(s): 82 Problem Description