关于O(能过)算法没有TLE却全体WA的那些事

P4168 [Violet] 蒲公英

B_1168 @ 2020-06-05 00:34:39

简而言之,抱着“试一试”的心态,写了个离散化暴力尝试卡过去----事实证明,评测结果并没有出现TLE情况,然而全体WA,样例能过,码风正常,有注释,求大佬帮忙看一下qwq

#include<bits/stdc++.h>
#define maxn 40005
using namespace std;

int n,m,cnt,mp[maxn];//mp数组是(离散化后)到(离散化前)的映射

struct node{
    int num,seq,upd;
}a[maxn];

//num:离散化前
//seq:输入顺序,用于离散化后复原顺序
//upd:离散化后

bool cmp1(node a,node b){//离散化
    return a.num<b.num;
}

bool cmp2(node a,node b){//复原顺序
    return a.seq<b.seq;
}

int main(){
//  freopen("P4168_1.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i].num);
        a[i].seq=i;//记录离散化前数值和顺序
    }
    sort(a+1,a+n+1,cmp1);
    cnt=0;//离散化值的计数器
    a[1].upd=0;
    for(int i=2;i<=n;i++){
        if(a[i].num>a[i-1].num){
            cnt++;
        }
        a[i].upd=cnt;
    }//随手写的离散化
    sort(a+1,a+n+1,cmp2);//恢复顺序
//  for(int i=1;i<=n;i++)printf("%d ",a[i].upd);
//  printf("\n");
    for(int i=1;i<=n;i++){
        mp[a[i].upd]=a[i].num;
    }//建立(离散化后)到(离散化前)的映射
    int l,r,cmax=0,ans=0;
    while(m--){
        scanf("%d%d",&l,&r);
        l=((l+ans-1)%n)+1;r=((r+ans-1)%n)+1;
        if(l>r)swap(l,r); //解密
//      printf("%d %d\n",l,r);
        ans=0;
        int b[cnt+1]; //该数组记载每个(离散化后的)数的出现次数
        memset(b,0,sizeof(b)); //每次memset,确保可靠性
        for(int i=l;i<=r;i++){
            b[a[i].upd]++;
        }
//      for(int i=0;i<=cnt;i++) printf("%d ",b[i]);
//      printf("\n");
        for(int i=cnt;i>=0;i--){
            if(cmax<=b[i]){
                cmax=b[i];
                ans=mp[i];
            }//在每一个离散化后的数后寻找哪一个数出现次数最多,如果找到了出现次数更多的,就更新“众数的出现次数”,利用先前建设的映射关系反离散化
        }
        if(ans==0) ans=mp[0];//卡样例……
        printf("%d\n",ans);
    } 
} 

/*
10 2
10 11 10 514 14 13 114 11 1919 14
1 5
2 5
*/
//测试无加密算法的样例

感谢大佬qwq


by metaphysis @ 2020-06-05 10:12:50

阅读您的代码,解题逻辑没有问题,但是有一个小Bug,修改后就可以AC了:cmax每次在使用前置0就可以了。

有空请您访问我的 CSDN博客,里面有我写的一本书,内有编程竞赛相关内容的介绍,并附有对应的练习题目(题目源自UVa OJ),可免费下载此书的PDF版本:《C++,挑战编程——程序设计竞赛进阶训练指南》。

@B_1168


by metaphysis @ 2020-06-05 10:16:27

您的代码加了注释,容易理解,很快就能找到问题所在,不像其他某些人的求助代码,又长又不加注释,真是想帮都没心情帮。

@B_1168


by B_1168 @ 2020-06-05 10:31:11

@metaphysis 感谢大佬查bug,这种bug样例查不出来,而且的确比较小,果然是旁观者清qwq


|