题意
题解
注:本文的代码中的输出不严格正确,反正loj的数据也没多强,不会PE。如果后面加强了当我没说
做法1
没错,第一个还是我的做法。
记得是哪年的SCP还是NOIP初赛竟然程序题就是这个思路,然后我照搬了。
我们这道题目反着考虑,它让我们加数,我们就删除数字,从后往前删除数字,我们先建一个排好序的链表,然后从中一个个删除数字,然后通过链表来跳,由于每次最多删除两个数字,除2就是一个,所以链表每次最多跳一次,时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)。
当然有一种情况要特殊考虑一下,就是当 n = 2 n=2 n=2时删除到了中位数的位置,这种情况要处理一下,其他也就没什么了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 11000
using namespace std;
struct fuck
{
int x,y;
}a[N];
inline bool cmp(fuck x,fuck y){
return x.x<y.x;}
struct node
{
int l,r,x/*权值*/;
}b[N];
void del(int x)
{
b[b[x].l].r=b[x].r;
b[b[x].r].l=b[x].l;
}
int n,be[N];
int list[N],top;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
top=0;
int t;scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].y=i;
b[i].l=i-1;b[i].r=i+1;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)be[a[i].y]=i,b