首页 > 其他分享 >牛客小白月赛80C/D又放学辣

牛客小白月赛80C/D又放学辣

时间:2023-11-05 20:45:25浏览次数:47  
标签:cl 80C ans mid 牛客 int num 小白月赛 include

C

这么小的数据范围,想必胡搞就可以了。


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,k;
struct cll{
    int p;
    int id;
}cl[105];
int x;
int ans[205];
bool cmp(cll x,cll y){
    return x.p>y.p;
}
void deal(int x){
    if(cl[x].p+k>n){
        ans[cl[x].id]=-1;
        return ;
    }
    int sum=0;
    for(int i=1;i<=m+1;++i){
      //  if(i==x) continue;
        sum=0;
        for(int j=1;j<i;++j){
            if(j==x) continue;
            sum+=cl[j].p;
        }
        int ex=k-(sum-(i-1-(x<i))*cl[i].p);
        if(ex<0){
            ans[cl[x].id]=cl[i].p+(-ex)/(i-1-(x<i))+((-ex)%(i-1-(x<i))!=0);
            return ;
        }else{
            if(ex==0){
            ans[cl[x].id]=cl[i].p;
            return ;
            }
        }
    }
    return ;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;++i){
        scanf("%d",&x);
        cl[x].p++;
    }
    for(int i=1;i<=m;++i){
        cl[i].id=i;
    }
    sort(cl+1,cl+m+1,cmp);
    for(int i=1;i<=m;++i){
        deal(i);
    }
    for(int i=1;i<=m;++i){
        cout<<ans[i]<<" ";
    }
    return 0;
}

D 数据很大,显然需要对于单个同学log时间内解决,怎么办呢?二分答案。二分答案怎么检查呢?再二分答案。
利用两个二分,就可以在\(o(nlogmlogm)\)时间内解决问题辣。


nclude<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m,k;
int x;
int sum[1000006];
struct cl{
    int num;
    int id;
}a[1000006];
int ans[1000006];
bool cmp(cl x,cl y){
    return x.num<y.num;
}
int bs(int x){
    int l=1;
    int r=m;
    while(l<r){
        int mid=(l+r)>>1;
        if(a[mid].num>=x) r=mid;
        else l=mid+1;
    }
    return l;
}
bool che(int x,int kk){
    int p=bs(kk);
    if(p>m) return 1;
    else if(p<=x) return sum[p]-a[x].num-(m-p)*(kk-1)-1<k;
    else return sum[p]-(m-p+1)*(kk-1)-1<k;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;++i){
        scanf("%d",&x);
        a[x].num++;
    }
    for(int i=1;i<=m;++i)
            a[i].id=i;
    sort(a+1,a+m+1,cmp);
    for(int i=m;i>=1;--i)
        sum[i]=sum[i+1]+a[i].num;
    for(int i=1;i<=m;++i){
        if(a[i].num+k>n){
            ans[a[i].id]=-1;
            continue;
        }
        int l=0;
        int r=n-a[i].num-k;
        while(l<r){
            int mid=(l+r+1)>>1;
            if(che(i,mid)) r=mid-1;
            else l=mid;
        }
        ans[a[i].id]=l;
    }
    for(int i=1;i<=m;++i)
        cout<<ans[i]<<" ";
    return 0;
}

标签:cl,80C,ans,mid,牛客,int,num,小白月赛,include
From: https://www.cnblogs.com/For-Miku/p/17811100.html

相关文章

  • 牛客练习赛117 C&D
    LinkC分类讨论贪心显然的,正面考虑怎么拼团会很麻烦,所以我们从另一个视角考虑,求出可能的最大团数,然后看一看怎么踢人能够使落单的最少。当K为偶数的时候,显然最大团数就是\((n+m*2)/k\),而当K为奇数的时候,显然男生抱团需要至少一个男生,女生抱团也需要至少一个男生,最大团数就是\(m......
  • 【牛客顺序结构 06】kiki学程序设计基础
    链接:https://ac.nowcoder.com/acm/contest/18839/1006来源:牛客网题目描述BoBo老师教了KiKi学习程序设计基础,他知道C++是带类的C语言,这个“++”主要包含三部分内容:对C语言进行语法上的扩展、面向对象(封装、继承和多态),STL(即模板)。这学期KiKi学习了C......
  • 2023牛客暑期多校训练营8 B Bloodline Counter 指数型生成函数 容斥 多项式求逆
    传送门容易想到求出竞赛图上最大环\(\lek\)的数量,再求出\(\lek-1\)的数量作差即可得到答案。设指数型生成函数\(G(x)\)表示大小为\(i\)的环的方案数。\(G(x)=\sum_{i=1}^k\frac{a_i}{i!}x^i\)那么最大环\(\lek\)的数量\(=[x^n]n!\sum_{i=1}^ki!\frac{(G(x))^i}{i!}\)这里......
  • 牛客剑指offer刷题链表篇
    @[TOC]从尾到头打印链表题目输入一个链表的头节点,从尾到头反过来打印出每个节点的值。思路利用栈后进先出的性质实现;代码实现privatestaticvoidprintReverseNode(ListNodehead){if(head==null){return;}ListNodepNode=head;......
  • 牛客小白月赛79 C题
    牛客小白月赛79C-mex和gcd的乘积C思路:靠,当时想到了怎么就是没有想出来呢,对于这个序列来说0就是一个突破点,我们只需要看看0出现的位置就可以了。区间mex=0时,ans=0区间mex=1时,看gcd的大小,此时仅看0左右元素即可区间mex>1时,gcd=1,看mex即可,仔细想想看整个数组的mex即......
  • 牛客小白月赛79
    牛客小白月赛79A.数位dp?解题思路:如果开始就是偶数,那么直接不用变化。如果开始不是偶数,那么个位数位上的数字一定不是偶数。换句话讲,只有个位数位上为偶数时,该数字才是偶数。所以,一直闪末尾数位,直到该数位为偶数或者删完为止。代码:#include<bits/stdc++.h>usingnamesp......
  • 数据库SQL实战|牛客网(查找入职员工时间排名倒数第三的员工所有信息)
    描述有一个员工employees表简况如下: 请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:输出:10005|1955-01-21|Kyoichi|Maliniak|M|1989-09-12droptableifexists`employees`;CREATETABLE`employees`(`emp_no`int(11)NOTNULL,`bir......
  • 牛客集训营提高组第二组第一题
    题目描述:链接:https://ac.nowcoder.com/acm/contest/65193/A给定正整数n,计算n 个元素的集合{1,2,⋯ ,n}所有非空子集和的乘积取模998 244 353998后的结果。n≤200。解题思路,n小于等于200并且子集所有的取值为n^2级别的,考虑跑背包,f[i]表示子集和为i的方案数,可以算出子集和......
  • 数据库SQL实战|牛客网
    查找最晚入职员工的所有信息.描述有一个员工employees表简况如下: 请你查找employees里最晚入职员工的所有信息,以上例子输出如下: 输入:droptableifexists`employees`;CREATETABLE`employees`(`emp_no`int(11)NOTNULL,`birth_date`dateNOTNULL,`first_na......
  • 牛客挑战赛70 B
    原题注意这个环指的是简单环这题用到一个非常trick的思路:给你一个图,让你保证每个点恰好处于一个环上。对于任意在环上的点\(p\),出入度都为\(1\),于是我们把它拆成两个点\(p_{in},p_{out}\)。则原图上的一条边\((u,v)\)在拆点后的图上对应\((u_{out},v_{in})\),而满足......