SCP-J T2求思路 帮必关

学术版

timmy0226 @ 2024-10-13 14:02:05

T了…… 求思路与正解 感谢dalao们


by da_ke @ 2024-10-13 14:03:27

@timmy0226 https://www.luogu.com.cn/article/o7n2liv3


by _8008008 @ 2024-10-13 14:04:23

@timmy0226 排序,然后统计排名即可,排名定义是奖牌数量大于它的人的数量。


by timmy0226 @ 2024-10-13 14:05:46

题面: 有 n 个小朋友参加了若干场比赛,其中第 i 个小朋友获得了 g[i]枚金牌、 s[i]枚银牌和 b[i]枚铜牌。老师希望每个小朋友制作一张所有小朋友的排行榜。

然而小朋友们为了让自己的排名尽量靠前,自然是可以动一些小心思的,体现在排序标准上——每个小朋友可以选择按照金牌数从大到小排序,也可以选择按照银牌数从大到小排序,也可以选择按照铜牌数从大到小排序。在小朋友自制的排行榜里,如果自己和别的小朋友并列,那么他可以把自己写在最前面。

给出每个小朋友获得的金牌数、银牌数和铜牌数,请对于每个小朋友 i,计算他在他自己的排行榜里最好能排第几名。


by rpyluogu @ 2024-10-13 14:08:20

排序后每次询问二分。


#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int g[200005],s[200005],b[200005];
int gc[200005],sc[200005],bc[200005];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(register int i=1;i<=n;i++){
        cin>>g[i]>>s[i]>>b[i];
        gc[i]=g[i];
        sc[i]=s[i];
        bc[i]=b[i];
    }
    sort(g+1,g+n+1);
    sort(s+1,s+n+1);
    sort(b+1,b+n+1);
    for(register int i=1;i<=n;i++){
        int cnt=0,res=0,tot=0;
        int ga=gc[i],sa=sc[i],ba=bc[i];
        cnt=upper_bound(g+1,g+n+1,ga)-g-1;
        res=upper_bound(s+1,s+n+1,sa)-s-1;
        tot=upper_bound(b+1,b+n+1,ba)-b-1;
        cnt=n-cnt+1; 
        res=n-res+1;
        tot=n-tot+1;
        cout<<min(cnt,min(res,tot))<<'\n';
    }
}

by timmy0226 @ 2024-10-13 14:12:43

谢谢各位dalao提供的思路,已关


by DGFLSzfd @ 2024-10-13 14:22:34

@timmy0226 无脑STL,排序后用map来记多少分排在第几名,虽然慢了一丢丢,但是无脑可以过 ,我10s就想出来了。


by timmy0226 @ 2024-10-13 17:18:58

@DGFLSzfd 谢谢思路,已关


by CNzzc @ 2024-10-13 17:51:36

@timmy0226 预处理所有选手按金、银、铜牌的名次,查询时求最小值

以972ms的时间卡过

记得关同步流

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define up(i,j,k,l) for(int i=j;i<=k;i+=l)
#define down(i,j,k,l) for(int i=j;i>=k;i-=l)
using namespace std;
const int N=2e5+10;
int n;
struct node{
    int g,s,b,w;
};
node a[N];
int t[N][5],d,ct;
bool cmp1(node x1,node x2)
{
    return x1.g>x2.g;
}
bool cmp2(node x1,node x2)
{
    return x1.s>x2.s;
}
bool cmp3(node x1,node x2)
{
    return x1.b>x2.b;
}
void solve()
{
    cin>>n;
    up(i,1,n,1){
        cin>>a[i].g>>a[i].s>>a[i].b;
        a[i].w=i;
    }
    sort(a+1,a+n+1,cmp1);
    ct=1;
    up(i,1,n,1){
        d=i;
        while(a[d].g==a[d+1].g && d+1<=n){
            t[a[d].w][1]=ct;
            d++;
        }
        t[a[d].w][1]=ct;
        ct+=d-i+1;
        i=d;
    }
    sort(a+1,a+n+1,cmp2);
    ct=1;
    up(i,1,n,1){
        d=i;
        while(a[d].s==a[d+1].s && d+1<=n){
            t[a[d].w][2]=ct;
            d++;
        }
        t[a[d].w][2]=ct;
        ct+=d-i+1;
        i=d;
    }   
    sort(a+1,a+n+1,cmp3);
    ct=1;
    up(i,1,n,1){
        d=i;
        while(a[d].b==a[d+1].b && d+1<=n){
            t[a[d].w][3]=ct;
            d++;
        }
        t[a[d].w][3]=ct;
        ct+=d-i+1;
        i=d;
    }
    up(i,1,n,1){
        cout<<min({t[i][1],t[i][2],t[i][3]})<<endl;
    }
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen("medal3.in","r",stdin);
    //freopen("CCC.out","w",stdout);
    int _=1;
    //cin>>_;
    while(_--){
        solve();
    }
    return 0;
}

by timmy0226 @ 2024-10-14 14:09:41

@CNzzc 感谢,已关


|