2015年长春网络赛1001
题意:有k个人要来,其中要开m次门,每次开门之前前t个人到了,可以进去p个人,最后q次询问第几个进去的人的编号
分析:这题网络赛时想到用优先队列做了,结果一直WA感觉好没道理下去后发现要对(t,p)排序,还是太弱了啊,而且下去自己敲得代码还一直有错,原来有警告都没发现,结果又是一直WA啊。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
using namespace std;
const int maxn = 150000 + 5;
struct node
{
char name[201];
int id;
int val;
};
node s[maxn];
int ans[maxn];
struct st{
int t, p;
bool operator < (const st &a) const
{
return t < a.t;
}
}in[maxn];
struct cmp
{
bool operator()(const int& i,const int&j)const//优先队列和sort里的运算符重载刚好相反,长记性了
{
return s[i].val < s[j].val || (s[i].val == s[j].val && s[i].id > s[j].id);
}
};
priority_queue<int,vector<int>,cmp> q;
int main()
{
//freopen("input.txt", "r", stdin);
int t;
scanf("%d",&t);
while (t--)
{
int k, m, qus;
memset(s, 0, sizeof(s));
memset(in, 0, sizeof(in));
scanf("%d%d%d", &k, &m, &qus);
for (int i = 1; i <= k; i++)
{
scanf("%s%d", s[i].name, &s[i].val);
s[i].id = i;
}
while (!q.empty())q.pop();
for (int i = 0; i < m; i++)
{
scanf("%d%d", &in[i].t, &in[i].p);
}
sort(in, in + m);
int rear = 1;
int cnt = 0;
for (int i = 0; i < m; i++)
{
for (; rear <= in[i].t; rear++)
{
q.push(rear);
}
for (int j = 0; j < in[i].p; j++)//此处BUG让我调了好久,注意j
{
if (!q.empty())
{
int pos=q.top();
ans[++cnt]=pos;
q.pop();
}
else break;
}
}
for (; rear <= k; rear++)
{
q.push(rear);
}
while (!q.empty()) {
int pos=q.top();
ans[++cnt]=pos;
q.pop();
}
int x;
scanf("%d", &x);
printf("%s", s[ans[x]].name);
for (int i = 1; i < qus; i++)
{
scanf("%d", &x);
printf(" %s", s[ans[x]].name);
}
printf("\n");
}
return 0;
}