首页 > 其他分享 >【题解】P10235 [yLCPC2024] C. 舞萌基本练习

【题解】P10235 [yLCPC2024] C. 舞萌基本练习

时间:2024-03-27 21:25:11浏览次数:33  
标签:qu P10235 int 题解 sum mid long 舞萌 逆序

P10235 舞萌基本练习 题解

思路

看到最大值最小首先考虑二分答案

由于答案满足单调性,可以二分不优美度的最大值,也就是逆序对数的最大值。

我们在每次增加一个元素的时候都要求解当前区间的逆序对数,所以不能用归并排序求逆序对数,考虑树状数组解法。

如果不会树状数组求逆序对,请出门右转P1908 逆序对

具体解法都写在代码里了。

#include<bits/stdc++.h>
using namespace std;
const int MX=100100;
#define int long long   //不开long long 见祖宗
int n,k;
int a[MX]={0};
int mid[MX]={0};
void li(){                    //离散化
    for(int i=1;i<=n;i++)  mid[i]=a[i];
    sort(mid+1,mid+n+1);
    int len=unique(mid+1,mid+1+n)-mid-1;
    for(int i=1;i<=n;i++){
        a[i]=lower_bound(mid+1,mid+1+len,a[i])-mid;
    }
}


int tree[MX]={0};                         //树状数组
inline int lowbit(int x){return x&(-x);}
void add(int x,int val){              
    for(;x<=n;x+=lowbit(x)){
        tree[x]+=val;
    }
}
int query(int x){
    int sum=0;
    for(;x;x-=lowbit(x)){
        sum+=tree[x];
    }
    return sum;
}

queue<int> qu;
void del(){                            //清空数组
    while(!qu.empty()){
        int x=qu.front();qu.pop();
        add(x,-1);
    }
}
bool check(int m){
    int l=1,r=1;           //l为当前区间左端点,r为当前区间右端点
    int sum=1,ni=0;        //sum为当前区间个数,ni为当前区间逆序对数
    while(r<=n){
        add(a[r],1);
        qu.push(a[r]);
        ni+=(r-l+1)-query(a[r]);      //统计逆序对数
        if(ni>m){                     //超过m就新划分一个区间
            sum++,l=r,ni=0;
            del();                    //树状数组清空
            if(sum>k)  break;         //如果超过k个就不合法
            continue;
        }
        r++;
    }
    del();    //记得清空数组
    if(sum>k)  return 0;              //如果超过k个就不合法
    return 1;
}
signed main(){
    int T;scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld",&n,&k);
        for(int i=1;i<=n;i++) scanf("%lld",a+i);
        li();
        int l=0,r=n*n,mid,ans=n*n;
        while (l<=r)             //二分答案
        {
            mid=(l+r)>>1;
            if(check(mid))  r=mid-1,ans=mid;
            else  l=mid+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

标签:qu,P10235,int,题解,sum,mid,long,舞萌,逆序
From: https://www.cnblogs.com/DaiFu/p/18100247

相关文章

  • 【题解】P4553 80人环游世界
    一眼丁真,鉴定为费用流思路类似于路径覆盖问题。考虑把每个点拆成入点\(x\)和出点\(y\)。对于每个点的入点\(x\)都向这个点的出点\(y\)连一条容量为\(V_i\),费用为\(0\)的边来控制每个点会被访问\(V_i\)次。然后建一个中间点\(p\),连一条\(s\Rightarrowp\)容量......
  • 2023第14届蓝桥杯大赛软件赛省赛C/C++大学A组第6题题解
    目录问题描述:方法一:dfs暴力模拟(45%)方法二:dfs剪枝(100%)问题描述:        小蓝正在一个瓜摊上买瓜。瓜摊上共有n个瓜,每个瓜的重量为Ai。小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。小蓝希望买到的瓜的重量的和恰好为m。请问小蓝至......
  • P7137 [THUPC2021 初赛] 切切糕 题解
    题目传送门前置知识博弈论解法由于本题是CF1628D1GameonSum(EasyVersion)的扩展,故先从CF1628D1GameonSum(EasyVersion)讲解。CF1628D1GameonSum(EasyVersion)设\(x_{i}\)表示第\(i\)轮时Alice选择的数。设\(f_{i,j}\)表示已经进行了\(i\)轮,且......
  • Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
    本文是SpringBoot开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题,既方便自己也方便他人,老鸟和新手皆适合,值得收藏......
  • 【赛题解析】【网络建设与运维】第三阶段Linux Vsftpd部分答案解析
    培训、环境、资料、考证公众号:波比网络公众号2:波比网络工作室网络建设与运维群:685678820波比网络专注于技能提升,赋能ftp服务任务描述:请采用ftp服务器,实现文件安全传输。1.配置 linux1为ftp服务器,安装vsftpd,新建本地用户xiaoming,本地用户登陆ftp后的目录为/var/ft......
  • CF1879的题解
    (一)对于第一个问题,直接搜出字符串中有多少个仅由\(0\)或\(1\)组成的串组成的。对于第二个问题,每个串只有一个能选,然后选择顺序有所不同,具体看代码。(二)AC代码。#defineintlonglong#definemd998244353usingnamespacestd;intt,s[200010];charch[200010];sign......
  • CF340B的题解
    (一)枚举对角线。然后分别找正在对角线上方的点与对角线端点构成三角形面积的最大值。和在对角线下方的点与对角线端点构成三角形面积的最大值。如果所有点都在同侧,那么不算。通过过两点直线的解析式求出另一点在直线的哪一侧。(二)AC代码。#include<bits/stdc++.h>#define......
  • CF1864C的题解
    (一)可以将\(x\)转为二进制。考虑一个数的二进制\((1\dots10\dots0)\)。其中,第一个省略号中有什么不确定,第二个省略号里都是\(0\)。易得,每个数都可以看成这种形式。那么可以每次去掉最后一位的\(1\),易证减去的数是原数的因数。最后会得到形如\((10\dots0)\),省略号中全是......
  • AT_abc345_c的题解
    (一)首先交换相同字符不改变字符串形态,那么就先统计是否有相同字符。交换不同字符容易证明不同操作后字符串各不相同。用前缀和或后缀和维护\(i+1\)到\(n\)中与\(i\)位置字符不同的数量。(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd......
  • AT_abc344_e的题解
    (一)这次ABC有点水。每个数记录前面那个数,和后面那个数。对于每个数,开个数组记录值,用map记录一个值的位置(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intpre[400010],cnt,las[400010],a[400010],n,q;map<int,int>mp;signedmain(......