zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/xuqiulin/p/4020032.html
Copyright © 2011-2022 走看看