2 solutions
-
0
map
#include <bits/stdc++.h> using namespace std; #define accelerate ios::sync_with_stdio(false),cin.tie(0); #define int long long #define PII pair<int,int> #define INF 0x3f3f3f3f #define ufor(i,st,en) for(int i=st;i<=en;i++) #define dfor(i,en,st) for(int i=en;i>=st;i--) const int N=2e5+10; unordered_map<int,int>ff; struct node{ int x,y; bool operator <(const node &xx){ return y<xx.y; } }a[N]; signed main(){ int n,m,x; accelerate; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i].x; a[i].y=i; ff[a[i].x]=i; } vector<node>v; for(int j=1;j<=m;j++){ cin>>x; if(ff[x]) v.push_back(node{a[ff[x]]}); } sort(v.begin(),v.end()); for(auto i:v) cout<<i.x<<" "; }
-
0
6675.你学完了?我羡慕了
本题设置的数据量在1e5的范围,要利用快排(quick_sort)和二分查找,不然会直接超时(当然,佬可以用map过)
注意加粗部分:“按在学科A中学号名单的先后次序输出”
这提醒我们学科A的学号名单是不能排序的,必须保留原有的次序状态。
那我们就只能对学科B进行排序,由于数据量比较大,防止超时就必须用快排算法。
void q_sort(int low,int high)//快排 { if(low>high)return; int temp = g[low]; int l=low,r=high; while(l!=r) { while(g[r]>=temp&&l<r)r--; while(g[l]<=temp&&l<r)l++; if(l<r)swap(g[l],g[r]); } g[low]=g[l]; g[l]=temp; q_sort(low,l-1); q_sort(l+1,high); }
再循环遍历学科A中的学号名单,分别查找是否在学科B中的名单中出现,老样子,数据量比较大,查询也得用二分查找。
int find(int x)//二分查找 { int l=0,r=m-1; while(l <= r) { int mid = (l+r+1)/2; if(g[mid]>=x)r=mid-1; else l=mid+1; } if(g[l]==x&&l<m&&l>=0)return l; return -1; }
只要能够在学科B名单中查到当前数字,即可直接保存到一个临时数组(因为这道题输出的末尾没有空格,所以不能直接输出)
完整代码:
#include <bits/stdc++.h> using namespace std; int k[100001],g[100001]; int n,m; int find(int x)//二分查找 { int l=0,r=m-1; while(l <= r) { int mid = (l+r+1)/2; if(g[mid]>=x)r=mid-1; else l=mid+1; } if(g[l]==x&&l<m&&l>=0)return l; return -1; } void q_sort(int low,int high)//快排 { if(low>high)return; int temp = g[low]; int l=low,r=high; while(l!=r) { while(g[r]>=temp&&l<r)r--; while(g[l]<=temp&&l<r)l++; if(l<r)swap(g[l],g[r]); } g[low]=g[l]; g[l]=temp; q_sort(low,l-1); q_sort(l+1,high); } int main() { cin>>n>>m; for(int i=0;i<n;i++)scanf("%d",&k[i]); for(int i=0;i<m;i++)scanf("%d",&g[i]); int j=0; int gcc[n]; q_sort(0,m-1); for(int i=0;i<n;i++) { int temp = find(k[i]); if(temp!=-1)gcc[j++]=k[i]; } for(int i=0;i<j;i++) { if(i!=j-1)cout<<gcc[i]<<" "; else cout<<gcc[i]; } return 0; }
- 1
Information
- ID
- 6675
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 119
- Accepted
- 28
- Uploaded By