幸福列車
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 2162 Accepted Submission(s): 666
他會記錄下全部乘客的名字(name)和他們的人品值(RP),根據這些將他們排序,並不時地從某輛列車裏踢出人品最不好(RP值最低)的一個人,當兩個人人品一樣不好時,他就會踢出名字難聽的人(linle認爲按字典順序,排在越在後面的人名字越難聽)。
當然出於列車行駛需要,他還會不時的發佈一些命令,比如讓某個乘客上車,合併某兩輛列車等。
linle的上一任祕書***因爲不能高效地執行他的這些命令而被炒魷魚,他現在正在尋覓新的祕書人選,你能不能勝任呢?(謝絕男士,待遇豐厚~~~)
對於每一組測試,第一行包含兩個整數 N ,M ,表示一共有N( N<=10000 ) 輛列車,執行M( M<=10000 )次操作。
接下來有 N (從1開始記數)輛列車的信息,每輛列車先有一個數字 Xi(1 <= Xi <= 100 ),表示該列車有Xi個乘客,接下來Xi行乘客信息,每個乘客包含名字(20個字符以內,不包含空白符)和人品(0<= RP <=30000)。
再接下來有 M 行操作信息,一共有3種操作,分別爲
GETON Xi name RP 表示有一個叫name的人品爲RP的人登上第Xi列車
JOIN Xi Xj 表示有將第Xj輛列車合併到Xi輛列車
GETOUT Xi 表示從第Xi輛列車踢出一個人品最差的人
測試數據保證每個操作均合法,即不會將已經被合併到其他列車的列車再進行合併,也不會從一輛空列車裏踢出乘客
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
int n,m;
char c[50];
struct node
{
char name[25];
int pb;
bool friend operator < (node a,node b)
{
if(a.pb==b.pb)
{
return strcmp(a.name,b.name)<0;
}
return a.pb>b.pb;
}
}a,temp;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int t=1;
priority_queue<node>q[10005];
while(n--)//下次能少用for,就不用,考試就是坑到這了!
{
int u;
scanf("%d",&u);
while(u--)
{
scanf("%s%d",a.name,&a.pb);
q[t].push(a);
}
t++;
}
while(m--)
{
scanf("%s",c);
if(strcmp(c,"GETON")==0)
{
int u;
scanf("%d%s%d",&u,a.name,&a.pb);
q[u].push(a);
}
else if(strcmp(c,"JOIN")==0)
{
int u,v;
scanf("%d%d",&u,&v);
while(!q[v].empty())
{
q[u].push(q[v].top());
q[v].pop();
}
}
else if(strcmp(c,"GETOUT")==0)
{
int u;
scanf("%d",&u);
temp=q[u].top();q[u].pop();
printf("%s\n",temp.name);
}
}
}
return 0;
}