分治—快速幂

[HEOI2016/TJOI2016] 排序

题目描述

\(2016\) 年,佳媛姐姐喜欢上了数字序列。因而她经常研究关于序列的一些奇奇怪怪的问题,现在她在研究一个难题,需要你来帮助她。

这个难题是这样子的:给出一个 \(1\)\(n\) 的排列,现在对这个排列序列进行 \(m\) 次局部排序,排序分为两种:

  • 0 l r 表示将区间 \([l,r]\) 的数字升序排序
  • 1 l r 表示将区间 \([l,r]\) 的数字降序排序

注意,这里是对下标在区间 \([l,r]\) 内的数排序。
最后询问第 \(q\) 位置上的数字。

输入格式

输入数据的第一行为两个整数 \(n\)\(m\)\(n\) 表示序列的长度,\(m\) 表示局部排序的次数。

第二行为 \(n\) 个整数,表示 \(1\)\(n\) 的一个排列。

接下来输入 \(m\) 行,每一行有三个整数 \(\text{op},l,r\)\(\text{op}\)\(0\) 代表升序排序,\(\text{op}\)\(1\) 代表降序排序, \(l,r\) 表示排序的区间。

最后输入一个整数 \(q\),表示排序完之后询问的位置

输出格式

输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第 \(q\) 位置上的数字。

样例 #1

样例输入 #1

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

样例输出 #1

5

提示

河北省选2016第一天第二题。

对于 \(30\%\) 的数据,\(n,m\leq 1000\)

对于 \(100\%\) 的数据,\(n,m\leq 10^5\)\(1\leq q\leq n\)

分析

可以进行a的平方的平方,需要算O(log2n),还有考虑如果n是奇数要单独在乘一次a,注意数据范围,防止超范围我们都用long long类型,同时取模,(ab)%m=(a%mb%m)%m

代码实现

#include <iostream>
using namespace std;
typedef long long ll;
ll fastpow (ll a,ll n,ll m){
    if (n == 0)return 1;
    if (n == 1)return a;
    ll temp = fastpow(a,n/2,m);
    if(n&1) return (temp*temp*a)%m;
    else return (temp*temp)%m;
}
int main()
{
    ll a,n,m;cin>>a>>n>>m;
    cout<<a<<"^"<<n<<" mod "<<m<<"="<<fastpow(a,n,m);
    return 0;
}
posted @ 2023-07-30 02:44  LongDz  阅读(19)  评论(0)    收藏  举报