预计分数: 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 }