赞
踩
题目传送门:D-Kth Excluded
初看该题,我天真的以为要用到stl的set或list,自我否认之后想到了用缺数二叉搜索拼出该数的方法,苦于没有合适的解法,经学长点拨后才知道原来还有差分数列这种东西,实在是太丢人了呜呜呜呜。
差分在该题的应用就是对应原数列的前面所缺的总数,再通过以前一个被移除数定位所查找的数。
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<set> #include<vector> using namespace std; long long s[100009];long long s1[100009]; int main(){ int n,q; cin>>n>>q; for(int i=1;i<=n;++i){ cin>>s[i]; } sort(s+1,s+1+n); for(int i=1;i<=n;++i){ s1[i]=s[i]-s[i-1]-1+s1[i-1];//构造差分数列 } //for(int i=1;i<=n;++i)cout<<i<<":"<<s1[i]<<endl; for(int i=0;i<q;++i){ long long b;cin>>b; int h=lower_bound(s1,s1+1+n,b)-s1;//找到能容纳第b号查找的最小差分元素 cout<<b+s[h-1]-s1[h-1]<<endl;//根据前一被删元素定位所查元素 } return 0; }
举例:
4 3
3 5 6 7
2
5
3
查找3号元素时,3前有二个未删元素,而5前有三个,定位到5,从3开始再找3-2=1,找到4。
又学到的一点点呢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。