题意:
给你一个长度为n的数组a,如果a[i]+a[i+1]是奇数,那么你可以交换a[i]和a[i+1],问你是否最终能让数组a非降。
题解:
中午没睡…下午昏昏沉沉的,思路不清晰。
我的想法是,先从小到大排序,每一个数都要到达排序好的位置,自然要让跟后面的比他小的所有数交换位置。因此就看每个数后面所有小于它的数是否与它同奇或者同偶。
我的方法是,到了当前位置,查看这个位置上所有与它同级或者同偶的小于它的数是否被取完了。
当然我这里就非常愚蠢了,为什么要看是否取完了呢?你直接看奇数序列和偶数数列是否分别递增不就好了?不知道在干什么浪费时间
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=1e9+5;
int a[N],b[N],od[N];
struct Array{
unordered_map<int,int>v;
int lowbit(int x){return x&(-x);}
void add(int x){
for(int i=x;i<M;i+=lowbit(i))
v[i]++;
}
int ask(int x){
int ans=0;
for(int i=x;i;i-=lowbit(i))
ans+=v[i];
return ans;
}
}tr[2];
int main()
{
int t;
scanf("%d",&t);
for(int tim=1;tim<=t;tim++){
tr[0].v.clear(),tr[1].v.clear();
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
for(int i=1;i<=n;i++)od[i]=od[i-1]+(b[i]%2);
int f=0;
for(int i=1;i<=n;i++){
tr[a[i]%2].add(a[i]);
int p=lower_bound(b+1,b+1+n,a[i])-b;
int num=a[i]%2?od[p]:p-od[p];
if(tr[a[i]%2].ask(a[i]-1)-num+1)f=1;
}
printf("%s\n",f?"NO":"YES");
}
return 0;
}