• 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),肯定超时。最开始的时候

    我怎么想都不知道怎么解决。以为是线段树。比赛完了以后,看了解题报告(http://bestcoder.hdu.edu.cn/

    我吓到了,原来是自己没有仔细分析题目的给的条件。Q i query current value of a[i], this operator will

    have at most 50.询问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:

      我们用flag记录平方次数。

      这样处理的时间复杂度O(50*n)

    AC代码:

     1 #include<cstdio>
     2 
     3 #define MAXN 100000+10
     4 #define MOD 1000000007
     5 
     6 int op[MAXN], count;
     7 
     8 int fun_1(int x, int n){
     9     n = (n + 1) >> 1;
    10     if(x <= n){
    11         return (x << 1) - 1;
    12     }
    13     return (x - n) << 1;
    14 }
    15 
    16 int fun_2(int x, int n){
    17     return n + 1 - x;
    18 }
    19 
    20 void solve(int x, int n){
    21     int flag = 0;//记录平方次数
    22 
    23     for(int i = count - 1; i >= 0; --i){//逆推回去 找出初始位置
    24         if(op[i] == 1){
    25             x = fun_1(x, n);
    26         }else if(op[i] == 2){
    27             x = fun_2(x, n);
    28         }else{
    29             flag++;
    30         }
    31     }
    32 
    33     __int64 num = x;
    34     for( ; flag > 0; --flag){
    35         num = num * num % MOD;
    36     }
    37     printf("%I64d
    ", num);
    38 }
    39 
    40 int main(){
    41     char str[5];
    42     int t, n, m, i, num;
    43 
    44     scanf("%d", &t);
    45     while(t--){
    46         scanf("%d%d", &n, &m);
    47         for(count = i = 0; i < m; ++i){
    48 
    49             scanf("%s%d", str, &num);
    50             if(str[0] == 'O'){
    51                 op[count++] = num;//记录执行fun1、fun2、fun3
    52             }else{
    53                 solve(num, n);
    54             }
    55         }
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    awk-使用
    缓存使用
    一致性hash-java实现treemap版
    线程同步-CountDownLatch
    一致性hash算法
    linux-配置字符串-grep
    linux-查找命令-find
    linux-网络监控命令-netstat进阶
    linux-网络监控命令-netstat初级
    linux-单引号、双引号、反引号的区别。
  • 原文地址:https://www.cnblogs.com/xuqiulin/p/4020032.html
Copyright © 2020-2023  润新知