A题双端对列
题目描述:
给定n个数 a[0],[1],,,,a[n-1] 每次把前两个取出来 然后大的放前面,小的放后面
有m次询问 每次问第i次操作时取出来的是多少
解题思路: 很容易推出来 当取到最大值a[index]时后面的就是一个循环 所以分两种情况 第一种i<=index,第二种I>index;(循环可能涉及到初始位置怎么设的问题,可以代个起点);
可以用双端队列模拟一遍 求出基础数组 (也可以数组模拟但麻烦)
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=100000+10;
int main(){
deque<int> que;
int n,m;
cin>>n>>m;
int a[MAX],b[MAX],c[MAX];
int ma=0;
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
que.push_back(x);
ma=max(x,ma);
}
int h=1;
while(que.front()!=ma){
int x=que.front();
que.pop_front();
int y=que.front();
que.pop_front();
b[h]=y;
a[h++]=x;
if(x>y) x^=y^=x^=y;
que.push_front(y),que.push_back(x);
}
h--;
que.pop_front();
int cc=0;
while(!que.empty()){
c[cc++]=que.front();
que.pop_front();
}
while(m--){
long long x;
scanf("%I64d",&x);
if(x<=h){
printf("%d %d\n",a[x],b[x]);
}
else {
printf("%d %d\n",ma,c[(x-h-1)%cc]);
}
}
}
查看7道真题和解析