please use 2 instead of 2.0, it should work,
(what is the contest code/name?)
you can write your own judge (in any from 35+ languages , please follow the standard judges,
or use your favourite
(please, be honest with (c))
//------------------------------------------------------------------------------------
//-
//- Vietnam Online Judge (VOJ) Ranking Program
//- Version 2.2 (07/11/2008)
//- (c) VNOI Team (http://vnoi.info)
//- English version
//-
//------------------------------------------------------------------------------------
//Thay doi
//2.2
//Fix loi: Detect duoc dong trang
//Khong dung scanf("..\n") nua
//2.1
//Bai nop cua problem setter se khong duoc tinh diem
//
//2.0
//Thay doi cach tinh diem
//Diem 1 bai = 80 / (40 + So nguoi AC) (giong SPOJ)
//Doi voi bai OI, nguoi AC = nguoi duoc 100 diem
//0.95:
//- Hien thi bai moi trong 1 tuan, ngay ra bai
//- Hien thi so nguoi hoan thien 1 bai
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;
#define pii pair<int, int>
#define pdi pair<double, int>
#define Exists(M, X) (M.find(X)!=M.end())
//Tap tin nhap xuat de dung khi debug
#define FIN "0.in"
#define FOUT "0.out"
FILE *inp;
FILE *out;
time_t currentTime;
//Ham doc va xuong dong
string readln()
{
char buf[1000];
fgets(buf, 1000, inp);
int len=strlen(buf)-1;
while(buf[len] == '\n' || buf[len] == '\r' || buf[len] == ' ') {len--;}
buf[len+1] = 0;
return buf;
}
//Trang lam bai
struct Contest
{
int startTime;
int endTime;
int solLimit;
string basePath;
string name;
void Load()
{
int l;
fscanf(inp, "%d", &l); readln();
fscanf(inp, "%d", &startTime); readln();
fscanf(inp, "%d", &endTime); readln();
fscanf(inp, "%d", &solLimit); readln();
basePath=readln();
name=readln();
for (int i = 0; i < l-5; i++)
readln();
}
};
//Bai tap
struct Problem
{
int id;
int timeLimit;
int opt;
string pset;
int round; //Vong trong ky thi marathon
int startTime;
int endTime;
string code;
string name;
string info;
int problemSetterID;
bool operator < (const Problem& p) const
{
return id < p.id;
}
void Load()
{
string tmp;
fscanf(inp, "%d", &id); readln();
fscanf(inp, "%d", &timeLimit); readln();
code=readln();
name=readln();
fscanf(inp, "%d", &opt); readln();
pset=readln();
fscanf(inp, "%d", &startTime); readln();
fscanf(inp, "%d", &endTime); readln();
info=readln();
fscanf(inp, "%d", &problemSetterID); readln();
}
};
//Thi sinh
struct User
{
int id;
string login;
string name;
string school;
string email;
string info;
void Load()
{
fscanf(inp, "%d", &id); readln();
login=readln();
name=readln();
email=readln();
school=readln();
info=readln();
}
};
//Chuong trinh nop
struct Submission
{
int uid;
int pid;
int timeStamp;
int status;
int language;
double score;
double time;
string date;
void Load()
{
string tmp;
fscanf(inp, "%d", &uid); readln();
fscanf(inp, "%d", &pid); readln();
fscanf(inp, "%d", &timeStamp); readln();
fscanf(inp, "%d", &status); readln();
fscanf(inp, "%d", &language); readln();
fscanf(inp, "%lf", &score); readln();
fscanf(inp, "%lf", &time); readln();
date=readln();
}
bool operator < (Submission s) const
{
return (score > s.score || (score==s.score && time < s.time));
}
};
#define UsersList map<int, User>
#define ProblemsList map<int, Problem>
#define SubmissionsList vector<Submission>
#define ResultTable map <pii, int>
Contest contest;
UsersList user;
ProblemsList problem;
SubmissionsList submission;
ResultTable result, oldResult;
//Doc danh sach thi sinh
void LoadUsersList()
{
int n, l;
fscanf(inp, "%d", &n); readln();
fscanf(inp, "%d", &l); readln();
for (int i = 0; i < n; i++)
{
User u;
u.Load();
user[u.id]=u;
for (int j = 0; j < l - 6; j++)
readln();
}
}
//Doc danh sach bai tap
void LoadProblemsList()
{
int n, l;
fscanf(inp, "%d", &n); readln();
fscanf(inp, "%d", &l); readln();
for (int i=0; i<n; i++)
{
Problem p;
p.Load();
problem[p.id]=p;
for (int j = 0; j < l - 10; j++)
readln();
}
}
//Doc danh sach chuong trinh nop
void LoadSubmissionsList()
{
int n, l;
readln();
fscanf(inp, "%d", &l); readln();
readln();
fscanf(inp, "%d", &n); readln();
for (int i = 0; i < n; i++)
{
Submission s;
s.Load();
//chi tinh nhung bai nop khong phai cua problem setter
if (Exists(problem, s.pid) && Exists(user, s.uid) && s.uid != problem[s.pid].problemSetterID)
submission.push_back(s);
for (int j=0; j < l - 8; j++)
readln();
}
};
//Tinh bang ket qua
//Phuong thuc tinh tuy theo la ky thi hay la Online Judge
//Chon chuong trinh cuoi cung hoac chuong trinh tot nhat
void CalcResultTable()
{
for (SubmissionsList::iterator it=submission.begin(); it!=submission.end(); ++it)
{
Problem p=problem[it->pid];
//Doi voi VOJ:
if (p.opt==0)
it->score=it->status==15?100:0;
//Su dung bai nop tot nhat cua moi thi sinh
//Neu la ky thi chon bai cuoi cung
pii info(it->uid, it->pid);
if (!Exists(result, info) || *it<submission[result[info]])
{
result[info]=it-submission.begin();
if (submission.end()-it > 1000) // ket qua truoc 1000 lan nop
oldResult[info]=it-submission.begin();
}
}
}
//So lieu thong ke
void OutputStatistics()
{
fprintf(out, "3 Statistics\n");
fprintf(out, "Submissions\n");
fprintf(out, "Problems\n");
fprintf(out, "Users\n");
fprintf(out, "1\n");
fprintf(out, "%d\n",submission.size());
fprintf(out, "%d\n",problem.size());
fprintf(out, "%d\n",user.size());
}
void OutputSchoolsList()
{
//so thanh vien accept mot bai
map<int, int> numberOfAC;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
if (Exists(result, pii(uid, pid)) && submission[result[pii(uid, pid)]].score==100) ++numberOfAC[pid];
}
}
//danh sach thanh vien
map<string, vector<pdi> > schoolMember;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
double score=0;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
if (Exists(result,pii(uid,pid)))
score+=submission[result[pii(uid,pid)]].score * 80 / (40 + numberOfAC[pid]) / 100;
}
//chi tinh nhung thi sinh co diem > 0
if (score > 0)
schoolMember[it->second.school].push_back(pdi(score, uid));
}
//diem don vi
vector<pair<double, string> > rankList;
//he so diem
#define COEF_R 0.73
for (map<string, vector<pdi> >::iterator it=schoolMember.begin(); it!=schoolMember.end(); ++it) {
vector<pdi> &v=it->second;
//chi lay nhung truong co 2 thanh vien tro len
//khong bang ""
if (it->first.length() > 0 && v.size() > 1) {
sort(v.begin(), v.end());
reverse(v.begin(), v.end());
double score=0;
for(int i=0; i<v.size(); ++i)
score+=v[i].first*pow(COEF_R, i);
rankList.push_back(make_pair(score, it->first));
}
}
sort(rankList.begin(), rankList.end());
reverse(rankList.begin(), rankList.end());
fprintf(out,"4 Đơn vị\n");
fprintf(out,"Hạng\n");
fprintf(out,"Đơn vị\n");
fprintf(out,"Thành viên\n");
fprintf(out,"Điểm\n");
fprintf(out,"%d\n",rankList.size());
for (int i=0; i<rankList.size(); ++i)
{
string schoolName=rankList[i].second;
vector<pdi> member=schoolMember[schoolName];
fprintf(out,"%d\n",i+1);
if (i==0) fprintf(out,"<font color='#FF0033'><b>");
fprintf(out,"%s\n",schoolName.c_str());
if (i==0) fprintf(out,"</b></font>");
fprintf(out,"<a href='#' title='");
fprintf(out,"%s (%.1lf điểm)", user[member[0].second].login.c_str(), member[0].first);
for (int i=1; i<member.size(); ++i)
fprintf(out,", %s (%.1lf điểm)", user[member[i].second].login.c_str(), member[i].first);
fprintf(out,"'>%d</a>\n", member.size());
fprintf(out,"%.1lf\n",rankList[i].first);
}
}
void OutputRankList()
{
//so thanh vien accept mot bai
map<int, int> numberOfAC;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
if (Exists(result, pii(uid, pid)) && submission[result[pii(uid, pid)]].score==100) ++numberOfAC[pid];
}
}
//so thanh vien toi da trong bang xep hang
const int TOP=100;
//rank list hien tai
vector <pdi> rankList;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
double score=0;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
if (Exists(result,pii(uid,pid)))
score+=submission[result[pii(uid,pid)]].score * 80 / (40 + numberOfAC[pid]) / 100;
}
rankList.push_back(pdi(score, uid));
}
sort(rankList.begin(), rankList.end());
reverse(rankList.begin(), rankList.end());
map<int, int> rank;
for (int i=0; i<rankList.size(); ++i)
rank[rankList[i].second]=i;
//rank list cu
vector <pdi> oldRankList;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
double score=0;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
if (Exists(oldResult,pii(uid,pid)))
score+=submission[oldResult[pii(uid,pid)]].score * 80 / (40 + numberOfAC[pid]) / 100;
}
oldRankList.push_back(pdi(score, uid));
}
sort(oldRankList.begin(), oldRankList.end());
reverse(oldRankList.begin(), oldRankList.end());
map<int, int> oldRank;
for (int i=0; i<oldRankList.size(); ++i)
oldRank[oldRankList[i].second]=i;
fprintf(out, "6 Hall of Fame\n");
fprintf(out, "Rank\n");
fprintf(out, "\n");
fprintf(out, "Username\n");
fprintf(out, "Name\n");
fprintf(out, "School\n");
fprintf(out, "Score\n");
fprintf(out, "%d\n", min(TOP, (int)rankList.size()));
for (int i=0; i<min(TOP, (int)rankList.size()); ++i)
{
int uid=rankList[i].second;
User u=user[uid];
fprintf(out, "%d\n", i+1);
int diff=oldRank[uid]-rank[uid];
if (diff > 0)
fprintf(out, "<font color='#00CC00'>+%d</a>", diff);
else if (diff <0)
fprintf(out, "<font color='#FF0033'>%d</a>", diff);
fprintf(out, "\n");
fprintf(out, "<a href='/%s/users/%s' title='Profile of %s'>%s</a>\n", contest.basePath.c_str(), u.login.c_str(), u.name.c_str(), u.login.c_str());
if (i==0) fprintf(out,"<font color='#FF0033'><b>");
fprintf(out, "%s", u.name.c_str());
if (i==0) fprintf(out,"</b></font>");
fprintf(out, "\n");
fprintf(out, "%s\n", u.school.c_str());
vector <int> incomplete;
fprintf(out, "<a href='/%s/status/%s' title='%s has solved ", contest.basePath.c_str(), u.login.c_str(), u.name.c_str());
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
if (!Exists(result,pii(uid,pid)) || submission[result[pii(uid,pid)]].score < 100)
incomplete.push_back(pid);
}
fprintf(out, "%d problems. Unsolved problems: ", problem.size()-incomplete.size());
for (int i=0; i<incomplete.size(); ++i)
{
Problem p=problem[incomplete[i]];
if (p.problemSetterID!=uid) {
if (i!=0) fprintf(out, ", ");
fprintf(out, "%s", p.code.c_str());
if (Exists(result,pii(uid,p.id)))
fprintf(out," (%.0lf)", submission[result[pii(uid,p.id)]].score);
}
}
fprintf(out, "'>%.1lf</a>\n", rankList[i].first);
}
}
void OutputProblemSetterList()
{
//so thanh vien toi da
const int TOP=100;
//rank list hien tai
vector <pii> rankList;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
int count=0;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
if (it->second.problemSetterID==uid) ++count;
}
if (count>0)
rankList.push_back(pii(count, uid));
}
sort(rankList.begin(), rankList.end());
reverse(rankList.begin(), rankList.end());
fprintf(out, "5 Problem-Setters\n");
fprintf(out, "Hạng\n");
fprintf(out, "Tài khoản\n");
fprintf(out, "Tên\n");
fprintf(out, "Đơn vị\n");
fprintf(out, "Số bài\n");
fprintf(out, "%d\n", min(TOP, (int)rankList.size()));
for (int i=0; i<min(TOP, (int)rankList.size()); ++i)
{
int uid=rankList[i].second;
User u=user[uid];
fprintf(out, "%d\n", i+1);
fprintf(out, "<a href='/%s/users/%s' title='Hồ sơ của %s'>%s</a>\n", contest.basePath.c_str(), u.login.c_str(), u.name.c_str(), u.login.c_str());
if (i==0) fprintf(out,"<font color='#FF0033'><b>");
fprintf(out, "%s", u.name.c_str());
if (i==0) fprintf(out,"</b></font>");
fprintf(out, "\n");
fprintf(out, "%s\n", u.school.c_str());
fprintf(out, "%d\n", rankList[i].first);
}
}
void OutputProblemsList()
{
//so thanh vien accept mot bai
map<int, int> numberOfAC;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
{
int pid=it->first;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
if (Exists(result, pii(uid, pid)) && submission[result[pii(uid, pid)]].score==100) ++numberOfAC[pid];
}
}
vector<pii> problemsList;
for (ProblemsList::iterator it=problem.begin(); it!=problem.end(); ++it)
problemsList.push_back(pii(numberOfAC[it->second.id], it->second.id));
sort(problemsList.begin(), problemsList.end());
reverse(problemsList.begin(), problemsList.end());
fprintf(out, "4 List of Problems\n");
fprintf(out, "Solved\n");
fprintf(out, "Code\n");
fprintf(out, "Name\n");
fprintf(out, "Best Solution\n");
fprintf(out, "%d\n", problem.size());
for (int i=0; i<problemsList.size(); ++i)
{
int bestSubmission=-1, numUsers=0, numAC=0;
int pid=problemsList[i].second;
for (UsersList::iterator it=user.begin(); it!=user.end(); ++it)
{
int uid=it->first;
if (Exists(result, pii(uid, pid)))
{
++numUsers;
if (submission[result[pii(uid, pid)]].score==100) ++numAC;
if (bestSubmission==-1 || submission[result[pii(uid, pid)]] < submission[bestSubmission])
bestSubmission=result[pii(uid,pid)];
}
}
Problem p=problem[problemsList[i].second];
fprintf(out, "<a href='/%s/ranks/%s' title='Statistics of Problem %s - %.1lf Points'>%d</a>\n", contest.basePath.c_str(), p.code.c_str(), p.code.c_str(), (double) 80 / (40 + 1 + numAC), numAC);
time_t pTime=(time_t)p.startTime;
tm startTime=*gmtime(&pTime);
bool newProblem=currentTime-pTime <= 604800;
fprintf(out, "<a href='/%s/problems/%s' title='View Problem %s′s Statement, ProblemSetter: %s - %d/%d/%d", contest.basePath.c_str(), p.code.c_str(), p.name.c_str(), user[p.problemSetterID].login.c_str(), startTime.tm_mday, startTime.tm_mon+1, 1900+startTime.tm_year);
if (newProblem) fprintf(out, " (New!)");
fprintf(out, "'>%s</a>\n", p.code.c_str());
if (newProblem) fprintf(out, "<font color='#00CC00'>");
fprintf(out, "%s", p.name.c_str());
if (newProblem) fprintf(out, "</font>");
fprintf(out, "\n");
if (bestSubmission==-1)
{
fprintf(out, "-\n");
}
else
{
Submission s=submission[bestSubmission];
User u=user[s.uid];
fprintf(out, "<a href='/%s/status/%s,%s' title='Best Solution of %s by %s: %.0lf, time %.2lfs'>%s</a>\n", contest.basePath.c_str(), p.code.c_str(), u.login.c_str(), p.code.c_str(), u.name.c_str(), s.score, s.time, u.login.c_str());
}
}
}
int main()
{
#ifdef ONLINE_JUDGE
inp=fdopen(0, "r");
out=fdopen(6, "w");
#else
inp=fopen(FIN,"r");
out=fopen(FOUT,"w");
#endif
time(¤tTime);
contest.Load();
LoadProblemsList();
LoadUsersList();
LoadSubmissionsList();
CalcResultTable();
fprintf(out, "3\n");
OutputStatistics();
// OutputSchoolsList();
OutputRankList();
// OutputProblemSetterList();
OutputProblemsList();
fclose(inp);
fclose(out);
return 0;
}
we plan to open wiki pages to share some knowledge about spoj (css, judges, locale, etc) (summer time?)