1 条题解
-
0
先将每个人按给出的过题数和罚时进行排序,然后根据每个人的初始位置和结束位置来预处理出每个人的排名,处理时注意两个人同排名的情况,最后O(1)查询。
#include<iostream> #include<algorithm> using namespace std; const int N = 1e5 + 10; struct node { int id; //初始位置 int ac; int t; }a[N]; int ans[N]; bool cmp(node n1, node n2) { if (n1.ac == n2.ac) return n1.t < n2.t; return n1.ac > n2.ac; } int main() { int n; cin >> n; for (int i = 1;i <= n;i++) { cin >> a[i].ac >> a[i].t; a[i].id = i; } sort(a + 1, a + n + 1, cmp); int p = 1; //当前排名 for (int i = 1;i <= n;i++) { if (a[i].ac != a[i - 1].ac || a[i].t != a[i - 1].t) { p = i; //如果跟前一个人不同则更新排名 p=i,否则不变 } ans[a[i].id] = p; } int q; cin >> q; while (q--) { int id; cin >> id; cout << ans[id] << endl; } return 0; }
信息
- ID
- 82
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 6
- 已通过
- 4
- 上传者