Codeforces 1638 B. Odd Swap Sort —— 树状数组,no,简单思维.

This way

题意:

给你一个长度为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;
}
上一篇:欧拉公式的证明


下一篇:Linux的常用命令(四)