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

博客内容涉及一个数组操作问题,题目要求通过特定条件交换数组元素,判断能否达到非降序排列。博主分享了思路,即先排序,然后检查奇偶性序列是否递增,但意识到原有方法存在效率问题。代码实现中使用了哈希映射辅助操作,最终检查过程中可以直接比较奇偶序列的递增性。
摘要由CSDN通过智能技术生成

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值