预计分数: 100+70+70 = 240

实际假分数 : 40+80+70= 190  in cena(好吧不得不承认这个分数,,,,,,=.=)

实际真分数 : 100+80+100 = 280 in luogu.org

一句话:stl,cena害我一生,,,,,,

 

消失的数字(number)

Time Limit:1000ms   Memory Limit:128MB

 

题目描述

rsy拥有n个数,这n个数分别是a1,a2,…,an。

后来出现了一个熊孩子zhw,用橡皮擦去了其中若干个数字,并且打乱了剩下的数字。rsy赶到现场后只剩下了m个数字b1,b2,…,bm,她想知道哪些数字被擦去了。

现在你需要告诉rsy被擦去的n-m个数是什么。

 

 

输入格式(number.in)

    第一行一个数n,第二行n个数ai,表示一开始的数字。

    第三行一个数m,第四行m个数bi,表示被擦去后的数字。

 

输出格式(number.out)

    一行n-m个数,从小到大输出所有被擦去的数字。

 

输入样例

5

1 3 5 7 8

3

3 5 8

 

输出样例

1 7

 

数据范围

对于30%的数据n<=1000,ai与bi都是有序的。

对于60%的数据n<=100000,ai与bi都是有序的。

对于80%的数据n<=100000,ai,bi<=n。

对于100%的数据n<=100000,1<=ai,bi<=10^9。

 

一开始傻乎乎的以为这是一眼题,随手敲了个map+栈感觉肯定AC,然后敲了个vector的暴力开始对拍,各种极端极限数据都没问题

结果!!!!

我还是高估cena了....

60分的超时也是醉了。。。。

在洛谷上最慢的点才700ms,,,,,

╮(╯▽╰)╭,,认命,,,,

 

正确做法:把两个数组都从小到大排一遍然后在A里把B中出现过得元素都删掉就好

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<stack>
 7 #include<cmath>
 8 #include<map>
 9 using namespace std;
10 int n,m;
11 int p;
12 map<int,int>a;
13 int maxn=-1;
14 int ans[100001];
15 int num=1;
16 int s[100001];
17 int top=1;
18 int main()
19 {
20     //freopen("number.in","r",stdin);
21     //freopen("number.out","w",stdout);
22     scanf("%d",&n);
23     for(int i=1;i<=n;i++)
24     {
25         scanf("%d",&p);
26         a[p]=a[p]+1;
27         if(p>maxn)maxn=p;
28         s[top]=p;top++;
29     }
30     scanf("%d",&m);
31     for(int i=1;i<=m;i++)
32     {
33         scanf("%d",&p);
34         a[p]=a[p]-1;
35     }
36     int q=a.size();
37     while(top!=0)
38     {
39         int p=s[top];top--;
40         if(a[p]!=0)
41         {
42             for(int i=1;i<=a[p];i++)
43             ans[num++]=p;
44             a[p]=0;
45         }
46     }
47     sort(ans+1,ans+num);
48     for(int i=1;i<=num-1;i++)
49     printf("%d ",ans[i]);
50     return 0;
51 }
龟速map+栈

相关文章: