Step1 Problem:
n个队伍,m个时刻。
每个时刻给你两个数 t p。该时刻 t 队伍AC一道题 罚时 p。
按解题数越高越前,解题数一样罚时越少越前,都一样的情况下1队伍一定是第一。
输出各个时刻1队伍的排名
例:
3 4
2 7
3 5
1 6
1 9
输出:
2
3
2
1
数据范围:
1<=n, m<=1e5, 1<=t<=n, 1<=p<=1000.
Step2 Involving algorithms:
STL set
Step3 Ideas:
set维护排名在1前面的队伍
该时刻其他队伍AC,如果该队伍在set里,删除。更新后如果比1排名前,插入
该时刻1队伍AC,将比1队伍排名后的全删除。
对于每个时刻输出set的大小。
Step4 Code:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
struct node
{
int id, data, num;
bool operator < (const node &b) const {
if(num == b.num && data == b.data) return id < b.id;
else if(num == b.num)
return data < b.data;
else return num > b.num;
}
// bool operator == (const node &b) const {
// if(id == b.id && data == b.data && num == b.num) return 1;
// else return 0;
// }
};
int vis[N], sol[N];
int main()
{
int n, m;
while(~scanf("%d %d", &n, &m))
{
memset(vis, 0, sizeof(vis));
memset(sol, 0, sizeof(sol));
set<node> q;
set<node>::iterator it;
int team, num;
while(m--)
{
scanf("%d %d", &team, &num);
it = q.find((node){team, vis[team], sol[team]});
if(it != q.end())
q.erase(it);
vis[team] += num;
sol[team]++;
node t1 = (node){1, vis[1], sol[1]};
node t2 = (node){team, vis[team], sol[team]};
if(team != 1)
{
if(t2 < t1)
q.insert((node){team, vis[team], sol[team]});
}
else
{
while(!q.empty() && (t1 < *(--q.end())))
{
q.erase(--q.end());
}
}
printf("%d\n", q.size()+1);
}
}
return 0;
}