| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
真坑,,数据弱的吓死人。评论区的那个代码我hack掉了。
实际上根本就没有0.7可以影响的数据,,居然直接优先队列判成绩高低都能AC,我服了。。
用正解不知道原因疯狂wa,
迷
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#include <limits.h>
#include <string>
#include <iostream>
#include <queue>
#include <math.h>
#include <map>
#include <stack>
#include <set>
#define left (now<<1)
#define right ((now<<1)+1)
#define mid ((l + r) >> 1)
#define midmid ((r + mid) >> 1)
#define LONG_LONG_MIN -9223372036854775808ll
#define LONG_LONG_MAX 9223372036854775807ll
using namespace std;
typedef long long int ll;
const int MAXN = 160;
struct s1{
int id,loc,grade,nowf;
};
struct cmp{
bool operator()(s1 x,s1 y){
if((x.loc == x.nowf && y.loc == y.nowf) || (x.loc != x.nowf && y.loc != y.nowf)){
return x.grade > y.grade;
}
int xx = x.loc == x.nowf ? x.grade * 10 : x.grade * 7;
int yy = y.loc == y.nowf ? y.grade * 10 : y.grade * 7;
if(xx != yy){
return xx > yy;
}
return x.loc == x.nowf;
}
};
int boyRankList[MAXN][MAXN],r[MAXN];
int boyMatch[MAXN],num[MAXN];
priority_queue<s1,vector<s1>,cmp> girlMatch[MAXN];
int manpos[MAXN],limit[MAXN];
queue<int> q;
s1 a[MAXN];
int n,m,t;
void findMatch(){
while(!q.empty()){ q.pop();}
for(int i = 1; i <= n; ++i){
q.push(i); boyMatch[i] = -1; manpos[i] = 0;
}
for(int i = 1; i <= m; ++i){
while(!girlMatch[i].empty()){
girlMatch[i].pop();
}
}
while(!q.empty()){
int s = q.size();
for(int i = 1; i <= s; ++i){
int now = q.front(); q.pop();
++manpos[now];
if(manpos[now] > num[now]){
continue;
}
int wanna = boyRankList[now][manpos[now]];
if(girlMatch[wanna].size() < limit[wanna]){
s1 x; x.id = now; x.grade = a[now].grade;
x.loc = a[now].loc; x.nowf = r[wanna];
girlMatch[wanna].push(x);
boyMatch[now] = wanna;
}else{
if(limit[wanna] > 0){
s1 y = girlMatch[wanna].top();
s1 x; x.id = now; x.grade = a[now].grade;
x.loc = a[now].loc; x.nowf = r[wanna];
if(x.grade > y.grade){
girlMatch[wanna].pop();
girlMatch[wanna].push(x);
boyMatch[now] = wanna;
boyMatch[y.id] = -1;
q.push(y.id);
}else{
q.push(now);
}
}else{
q.push(now);
}
}
}
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i){
scanf("%d%d",&a[i].loc,&a[i].grade); a[i].id = i;
scanf("%d",&num[i]);
for(int j = 1; j <= num[i]; ++j){
scanf("%d",&boyRankList[i][j]);
}
}
for(int i = 1; i <= m; ++i){
scanf("%d%d",&r[i],&limit[i]);
}
findMatch();
for(int i = 1; i <= n; ++i){
if(boyMatch[i] == -1){
printf("not accepted\n");
}else{
printf("%d\n",boyMatch[i]);
}
}
printf("\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator