1 条题解

  • 0
    @ 2022-11-19 20:20:35

    先将每个人按给出的过题数和罚时进行排序,然后根据每个人的初始位置和结束位置来预处理出每个人的排名,处理时注意两个人同排名的情况,最后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
    上传者