简而言之,抱着“试一试”的心态,写了个离散化暴力尝试卡过去----事实证明,评测结果并没有出现TLE情况,然而全体WA,样例能过,码风正常,有注释,求大佬帮忙看一下qwq
#include<bits/stdc++.h>
#define maxn 40005
using namespace std;
int n,m,cnt,mp[maxn];//mp数组是(离散化后)到(离散化前)的映射
struct node{
int num,seq,upd;
}a[maxn];
//num:离散化前
//seq:输入顺序,用于离散化后复原顺序
//upd:离散化后
bool cmp1(node a,node b){//离散化
return a.num<b.num;
}
bool cmp2(node a,node b){//复原顺序
return a.seq<b.seq;
}
int main(){
// freopen("P4168_1.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].num);
a[i].seq=i;//记录离散化前数值和顺序
}
sort(a+1,a+n+1,cmp1);
cnt=0;//离散化值的计数器
a[1].upd=0;
for(int i=2;i<=n;i++){
if(a[i].num>a[i-1].num){
cnt++;
}
a[i].upd=cnt;
}//随手写的离散化
sort(a+1,a+n+1,cmp2);//恢复顺序
// for(int i=1;i<=n;i++)printf("%d ",a[i].upd);
// printf("\n");
for(int i=1;i<=n;i++){
mp[a[i].upd]=a[i].num;
}//建立(离散化后)到(离散化前)的映射
int l,r,cmax=0,ans=0;
while(m--){
scanf("%d%d",&l,&r);
l=((l+ans-1)%n)+1;r=((r+ans-1)%n)+1;
if(l>r)swap(l,r); //解密
// printf("%d %d\n",l,r);
ans=0;
int b[cnt+1]; //该数组记载每个(离散化后的)数的出现次数
memset(b,0,sizeof(b)); //每次memset,确保可靠性
for(int i=l;i<=r;i++){
b[a[i].upd]++;
}
// for(int i=0;i<=cnt;i++) printf("%d ",b[i]);
// printf("\n");
for(int i=cnt;i>=0;i--){
if(cmax<=b[i]){
cmax=b[i];
ans=mp[i];
}//在每一个离散化后的数后寻找哪一个数出现次数最多,如果找到了出现次数更多的,就更新“众数的出现次数”,利用先前建设的映射关系反离散化
}
if(ans==0) ans=mp[0];//卡样例……
printf("%d\n",ans);
}
}
/*
10 2
10 11 10 514 14 13 114 11 1919 14
1 5
2 5
*/
//测试无加密算法的样例
感谢大佬qwq