1 / 5
May 2009

I don't really understand why other judgement code doesn't work.
I use "ACM Contest Judge" and I want to change it "Sum-of-points Contest Judge" but it doesnt work somehow.
Actually it gives error

"Contest judge error.
In the 'Edit contest' menu, please fill in the 'Info' field for each problem with a floating point numerical value."

I filled each Info field with 2.0 but it doesn't make anything change.

Suppose I have to edit each problem to sum-of-points? (Well it doesnt work either)

What should I do to make a contest with a ranking system(judge system) sum-of-points actually something like spoj.pl/OI/ranks/

  • created

    May '09
  • last reply

    Jun '09
  • 4

    replies

  • 920

    views

  • 3

    users

  • 2

    links

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 wink, please follow the standard judges,

or use your favourite smiley
(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 &#272;&#417;n v&#7883;\n");
fprintf(out,"H&#7841;ng\n");
fprintf(out,"&#272;&#417;n v&#7883;\n");
fprintf(out,"Th&#224;nh vi&#234;n\n");	
fprintf(out,"&#272;i&#7875;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 &#273;i&#7875;m)", user[member[0].second].login.c_str(), member[0].first);					
	for (int i=1; i<member.size(); ++i)
		fprintf(out,", %s (%.1lf &#273;i&#7875;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&#7841;ng\n");
fprintf(out, "T&#224;i kho&#7843;n\n");
fprintf(out, "T&#234;n\n");
fprintf(out, "&#272;&#417;n v&#7883;\n");
fprintf(out, "S&#7889; b&#224;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&#7891; s&#417; c&#7911;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&prime;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(&currentTime);	

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?)

11 days later

Problem solved smiley by the way how can i change result field of judge status question

8 days later

I want to write a contest judge in Pascal, but how can I read Input and write Output ? Pascal seems not to have the function "fdopen"..