求调(或hack)月赛B
查看原帖
求调(或hack)月赛B
555065
ChrysanthBlossom楼主2023/7/15 18:11

这是我第一遍写的代码,得了60分

#include <bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
/*
每道题check的步骤:
1.maxn
2.有无mod
3.图是否联通
4.数据最大值(有无超int/ll/int128)
*/
const int maxn=1e6+5;
int n,k;
int a[maxn],b[maxn],c[maxn],d[maxn],e[maxn];
signed main(){
    ios::sync_with_stdio(0);
    cin>>n>>k;
    for(ri i=1;i<=n;i++){cin>>a[i];b[a[i]]++;}
    for(ri i=1;i<=n;i++)c[b[i]]+=1;
    for(ri i=1;i<=n;i++)c[i]+=c[i+1];
    for(ri i=n;i>=1;i--)d[i]=c[i]+d[i+1];
    for(ri i=1;i<=n;i++)if(d[i])e[d[i]]=i;
    for(ri i=1;i<=n;i++)
        if(!e[i])e[i]=e[i-1];
    int maxi=0;
    for(ri i=1;i<=n;i++)maxi=max(b[i],maxi);
    for(ri i=0;i<=n;i++){
        if(!e[i])e[i]=maxi;
        else e[i]--;
    }
    maxi=e[k];
    if(k>=maxi){cout<<"pigstd";return 0;}
    int cnt=0;
    for(ri i=1;i<=n;i++){
        if(b[i]+k>=maxi)cnt++;
    }
    cout<<cnt;
    return 0;
}

这是我第二遍写的代码,得了100分

#include <bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
/*
每道题check的步骤:
1.maxn
2.有无mod
3.图是否联通
4.数据最大值(有无超int/ll/int128)
*/
const int maxn=1e6+5;
int n,k;
int a[maxn],b[maxn],c[maxn];
signed main(){
    ios::sync_with_stdio(0);
    cin>>n>>k;
    for(ri i=1;i<=n;i++){cin>>a[i];b[a[i]]++;}
    sort(b+1,b+n+1);
    for(ri i=1;i<=n/2;i++)swap(b[i],b[n-i+1]);
    int cnt=0;
    for(ri i=1;i<=n;i++)cnt+=(b[i]?1:0);
    n=cnt;
    sort(b+1,b+1+n);
    for(ri i=1;i<=n;i++)c[i]=c[i-1]+b[i];
    cnt=0;
    for(ri i=1;i<=n+1;i++){
        int t=b[i]+k,kk=k;
        int fd=upper_bound(b+1,b+1+n,t)-b;
        kk-=c[n]-c[fd-1]-t*(n-fd+1);
        if(kk>=0){
            cnt++;
            if(b[i]==0){cout<<"pigstd";return 0;}
        }
    }cout<<cnt;return 0;
}

显然,两份代码思路基本相同,无非是把判断的方式改了改,并将 O(n)O(n) 换成 O(nlog⁡n)O(n \log n) ,但第一份就是出问题了,于是感到十分疑惑,因此在这里求一下调第一份代码的方法或给一个能hack掉第一份代码的数据

2023/7/15 18:11
加载中...