【8.5 测试】辉夜的序列

                        辉夜的序列
【题目背景】
又是某高中学生会无聊的一天,辉夜同学由于实在太闲,在摆弄她的 n 颗巧克力
【问题描述】
突然,由于某种神秘力量,她的巧克力形成了一个神秘序列。她看到这个神秘
的序列,想到了一条水题。由于真的太水了,她不好意思告诉别人。但她看着你好奇
的目光,偷偷告诉了你题目。
每个巧克力都有一个可爱值 x ,x 为小于 n 的正整数,且互不相同。问最少的
操作数使巧可力的可爱值从左到右,由小到大递增。
对于每个操作,你可以取出一部分巧克力(可以不连续的子序列),按原有的顺序放到
所有巧克力的最左边。
然而出题人想起了 GDOI 拼题的优秀传统(想起了被 网络流拼SAM作为签到题 支配的恐
惧),想要考下快速幂。设答案为 y ,输出 y^998244355 ( y 的 998244355 次方)
对 998244353 取模
【输入格式】
第一行,一个整数 T,T<=5,表示有T组数据。
对于每组数据
第一行 1 个整数 n。
第二行 n 个整数,表示每个巧克力的可爱值,它们构成一个排列。
【输出格式】
输出一行 1 个整数表示答案。
【样例输入】
2
5
5 4 3 2 1
4
1 2 3 4
【样例输出】
27
0
对于第一组
第一次取 4 2,放到左边,变成 4 2 5 3 1
第二次取 2 3,放到左边,变成 2 3 4 5 1
第三次取 1, 放到左边,变成 1 2 3 4 5
【数据范围】
序号 n的最大值
1 5
2 10
3 20
4 50
5 100
6 1000
7 1000
8 2000
9 100000
10 200000
对于第3,6个测试点,满足 x 单调递减

题解:     玄学算法石锤了!who能想到二进制。。。。

           每个数取二进制再-1。从低位向高位不断“找”。

           只要这一位是0就把提到最前面。

           然后如果两个数有序,后一数字的二进制和前面数字一样。

          (可能还是不懂,举个例子哈,图片有点透明,但还是能看清的)

           ps:原文的快速幂其实就是这个数立方…太玄学! 

  

附上更玄学的代码

#include <bits/stdc++.h>

using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))

typedef long long LL;

const int N=300300;

int T,n,num[N],ans,tu;

int main()
{
    freopen("kaguya1.in", "r", stdin);
    freopen("kaguya1.ans", "w", stdout);
    
    cin>>T;
    while(T--)
    {
    tu=ans=0;
    
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        num[x]=i;
    }
    
    for(int i=2;i<=n;i++)
    if(num[i]<num[i-1])
    ans++;
    
    while(ans)
    {
        ans/=2;
        tu++;
    }
    
    cout<<tu*tu*tu<<endl;
    
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wuhu-JJJ/p/11307806.html
8.5