您的位置:首页 > 其它

Codeforces Round #215 (diy.2) B.Sereja and Suffixes

2013-11-27 07:35 495 查看
题目链接:点击打开链接

题目大意:

给一列数an,然后有m个询问(l1,l2,...,lm)

问ali-an之间有多少不同的数。(li为下标)

不得不吐槽自己的代码能力和debug能力!!

开始超时了,用了O(n*n)的for循环,每读入一个数就从此数开始向后遍历直到an。

后来很快改成,先记录询问,然后o(n)的for语句遍历一次,

把所有询问的结果记录下来。

开始忘了考虑询问相同的情况。

改好后,最后总是wa在第三组数据!!!其实就是可能连续x个(x>=2)个询问都是相同的啊。。。

所以要用while而不是if!!!

如果用if,那么只处理了相邻两个相同的询问,当处理第3个时,k已经增加,cnt值也已经更新。

所以第3个值在第2个值上+1,第4个+2.。。。而且后面比这个w小的询问有可能是0.因为在k增加的时候,

已经错过了判断相等的时机啊。。。!!!!!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<queue>
#include<cstring>
#include<string>
#define INF 0x3f3f3f3f

using namespace std;

int a[100010];
int vis[100010];
struct node
{
    int id;
    int w;
}b[100010];
int ans[100010];

bool cmp(node x,node y)
{
    return x.w>=y.w;
}

int main()
{
    int n,m,cnt;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(ans,0,sizeof(ans));

        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int j=0;j<m;j++)
        {
            scanf("%d",&b[j].w);
            b[j].id=j;
        }
        sort(b,b+m,cmp);
        memset(vis,0,sizeof(vis));

        cnt=0;
        int r=0,f;

        //for(int i=0;i<m;i++)
          //  cout<<b[i].id<<' '<<b[i].w<<endl;

        for(int k=n;k>=b[m-1].w;k--)
        {
            if(!vis[a[k]])
            {
                vis[a[k]]=1;
                cnt++;
            }
            if(k==b[r].w)
            {
                ans[b[r].id]=cnt;
                f=b[r].w;
                r++;
            }
            while(b[r].w==f)     //此处用了if,遗憾+悔恨!
            {
                ans[b[r].id]=cnt;
                r++;
            }
        }

        for(int i=0;i<m;i++)
           printf("%d\n",ans[i]);

    }
    return 0;
}

/*

7 10
1 3 8 6 2 2 7
4 2 6 3 4 4 6 2 7 4

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: