Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
13 kB
13
Indexable
Never
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdio.h>

#define CMD_INIT				(100)
#define CMD_WRITE_MESSAGE		(200)
#define CMD_COMMENT_TO			(300)
#define CMD_ERASE				(400)
#define CMD_GET_BEST_MESSAGES	(500)
#define CMD_GET_BEST_USERS		(600)

#define MAXL	(10)	

extern void init();
extern int writeMessage(char mUser[], int mID, int mPoint);
extern int commentTo(char mUser[], int mID, int mTargetID, int mPoint);
extern int erase(int mID);
extern void getBestMessages(int mBestMessageList[]);
extern void getBestUsers(char mBestUserList[][MAXL + 1]);

static int mstrcmp(char a[], char b[])
{
	int idx = 0;
	while (a[idx] != '\0' && a[idx] == b[idx])
		++idx;
	return a[idx] - b[idx];
}

static bool run()
{
	int Q;
	int mID, mTargetID, mPoint;
	char mUser[MAXL + 1];
	char mBestUserList[5][MAXL + 1];
	int mBestMessageList[5];

	int ret = -1, ans;

	scanf("%d", &Q);

	bool okay = false;

	for (int q = 0; q < Q; ++q)
	{
		int cmd;
		scanf("%d", &cmd);
		switch(cmd)
		{
		case CMD_INIT:
			init();
			okay = true;
			break;
		case CMD_WRITE_MESSAGE:
			scanf("%s %d %d", mUser, &mID, &mPoint);
			ret = writeMessage(mUser, mID, mPoint);
			scanf("%d", &ans);
			if (ret != ans)
				okay = false;
			break;
		case CMD_COMMENT_TO:
			scanf("%s %d %d %d", mUser, &mID, &mTargetID, &mPoint);
			ret = commentTo(mUser, mID, mTargetID, mPoint);
			scanf("%d", &ans);
			if (ret != ans)
				okay = false;
			break;
		case CMD_ERASE:
			scanf("%d", &mID);
			ret = erase(mID);
			scanf("%d", &ans);
			if (ret != ans)
				okay = false;
			break;
		case CMD_GET_BEST_MESSAGES:
			getBestMessages(mBestMessageList);
			for (int i = 0; i < 5; ++i)
			{
				scanf("%d", &ans);
				if (mBestMessageList[i] != ans)
					okay = false;
			}
			break;
		case CMD_GET_BEST_USERS:
			getBestUsers(mBestUserList);
			for (int i = 0; i < 5; ++i)
			{
				scanf("%s", mUser);
				if (mstrcmp(mBestUserList[i], mUser) != 0)
					okay = false;
			}
			break;
		default:
			okay = false;
			break;
		}
	}

	return okay;
}

int main()
{
	setbuf(stdout, NULL);
	//freopen("sample_input.txt", "r", stdin);

	int TC, MARK;

	scanf("%d %d", &TC, &MARK);
	for (int tc = 1; tc <= TC; ++tc)
	{
		int score = run() ? MARK : 0;
		printf("#%d %d\n", tc, score);
	}

	return 0;
}





#define MAXL	(10)

void init()
{
	return;
}

int writeMessage(char mUser[], int mID, int mPoint)
{
	return -1;
}

int commentTo(char mUser[], int mID, int mTargetID, int mPoint)
{
	return -1;
}

int erase(int mID)
{
	return -1;
}

void getBestMessages(int mBestMessageList[])
{
	return;
}

void getBestUsers(char mBestUserList[][MAXL + 1])
{
	return;
}





An electronic bulletin board allows users to publish posts.



 

Users are allowed to write comments on the published posts. Also, they can add replies to the comments. However, they are not allowed to reply to replies.

 

Posts, comments and replies may be deleted. When a post is deleted, all comments and replies added to it are deleted. When a comment is deleted, all replies added to it are deleted.

 

All users have different names. In other words, same name means same user.

Posts, comments, and replies have different IDs. In other words, there are no duplicate IDs among all IDs of posts, comments, and replies.

 

Each of posts, comments, and replies gets points.

 

Using the points of posts, comments, and replies, the bulletin board shows the best post or user.

Adding the points of a post, and all points of comments and replies added to the post, the best post section shows, in descending order, the top 5 posts in terms of the highest sum of points.

In the case of same sum of points, the post with a lower ID number has a higher rank.

Adding the points of posts, comments, and replies each user wrote, the best user section shows, in descending order, the top 5 users in terms of the highest sum of points.

In the case of same sum of points, the user whose name precedes those of others in lexicographic order is ranked higher.

 

Deleted posts, comments, and replies are not counted, when adding points.

 

Implement each required function by referring to the following API description.

※ The function signature below is based on C/C++. As for other languages, refer to the provided Main and User Code.

The following is the description of API to be written in the User Code.

 

void init()

This initialization function for each test case is called once in the beginning of each test case.

 

No posts are published on the electronic bulletin board at first.

int writeMessage(char mUser[], int mID, int mPoint)

A user whose name is mUser writes and publishes a post which has the ID of mID and points of mPoint. Return the total points the user got after publishing the post.

 

The total points of the user equal to the sum of all points of posts, comments, and replies the user wrote. Deleted posts, comments, and replies do not count.

 

It is guaranteed that mID passed when calling the function is not a value passed already during previous calls.

 

mUser is a character string consisting of English lower case letters. Its length is greater than or equal to 1 but less than or equal to 10.

 

※ As for C++ and Java, the character string ends with ‘\0’ which is not included in the length. As for Python, it is passed as an object of str.

 

Parameters
  mUser : the name of the user to write a post (1 ≤ |mUser| ≤ 10, |a| means the length of the character string a.)
  mID : the ID of the post to be written (1 ≤ mID ≤ 1,000,000,000)
  mPoint : the points of the post to be written (1 ≤ mPoint ≤ 10,000)

Returns
  the total points of user mUser after publishing a new post

int commentTo(char mUser[], int mID, int mTargetID, int mPoint)

A user named mUser adds a comment or a reply, which has mPoint points and the ID of mID, to a post or a comment with the ID of mTargetID.

 

If mTargetID is the ID of a post, add the comment mID to the post mTargetID, and return the sum of points of the post mTargetID.

If mTargetID is the ID of a comment, add the reply mID to the comment mTargetID, and return the sum of points of the post to which the comment mTargetID is added.

 

The sum of points of a post is calculated by adding the point of the post and the points of replies and comments added to the post. Do not add points of deleted comments and replies.

 

It is guaranteed that mTargetID passed when calling the function is the ID of a post or a comment which is not deleted.

It is guaranteed that mID passed when calling the function is not a value passed already during previous calls.

 

mUser is a character string consisting of English lower case letters and the length is greater than or equal to 1 but less than or equal to 10.

 

Parameters
  mUser : the name of the user to write a comment or a reply (1 ≤ |mUser| ≤ 10)
  mID : the ID of the comment or reply (1 ≤ mID ≤ 1,000,000,000)
  mTargetID : the ID of the post or comment to which a comment or reply is to be added (1 ≤ mTargetID ≤ 1,000,000,000)
  mPoint : the points of the comment or reply (1 ≤ mPoint ≤ 10,000)

Returns
  the sum of points of the post to which a comment or reply is added after publishing the post

int erase(int mID)

Delete the post, comment, or reply with the ID of mID.

 

If mID is the ID of a post, return the total points of the user who wrote the deleted post mID.

If mID is the ID of a comment or a reply, return the sum of points of the post to which the deleted comment or reply was added.

 

It is guaranteed that mID is the ID of a published post or comment that is not deleted.

 

Parameters
  mID : the ID of a post, comment, or reply to be deleted (1 ≤ mID ≤ 1,000,000,000)

Returns
  If mID is the ID of a post, the total points of the user
  If mID is the ID of a comment or a reply, the sum of points of the post

void getBestMessages(int mBestMessageList[])

On mBestMessageList, save, in descending order, the ID of the top 5 posts in terms of the highest sum of points. In the case of same sum of points, the post with a lower ID is ranked higher.

 

On mBestMessageList[i – 1], save the ID of the post with the ith highest sum of points. (1 ≤ i ≤ 5)

 

It is guaranteed that 5 or more posts are published on the bulletin board when the function is called.

 

Parameters
  mBestMessageList : the array on which the IDs of posts with the highest sum of points will be saved

void getBestUsers(char mBestUserList[][])

On mBestUserList, save, in descending order, the name of the top 5 users in terms of the highest total points. In the case of same total points, the user whose name comes first in lexicographic order is ranked higher.

 

On mBestUserList[i – 1], save the name of the user with the ith highest total points. (1 ≤ i ≤ 5)

 

※ As for C++ and Java, save ‘\0’ at the end of the string. As for Python, save str object.

 

It is guaranteed that when the function is called, there are 5 or more users who wrote a post, comment, or reply which is not deleted.

 

Parameters
  mBestUserList : the array on which the name of users with the highest total points will be saved

[Example]

Let’s think about the case where functions are called as in [Table 1].

Order

Function

Return

Figure

1

init()

 

 

2

writeMessage(“aaa”, 1, 10)

10

 

3

writeMessage(“bbb”, 2, 5)

5

 

4

commentTo(“ccc”, 3, 1, 5)

15

 

5

commentTo(“ddd”, 4, 1, 3)

18

 

6

commentTo(“eee”, 5, 3, 4)

22

 

7

getBestUsers()

{“aaa”, “bbb”, “ccc”, “eee”, “ddd”}

[Fig. 2]

8

writeMessage(“ccc”, 6, 20)

25

 

9

writeMessage(“bbb”, 7, 13)

18

 

10

writeMessage(“aaa”, 8, 20)

30

 

11

getBestMessages()

{1, 6, 8, 7, 2}

[Fig. 3]

12

writeMessage(“fff”, 9, 1)

1

 

13

commentTo(“ddd”, 10, 6, 10)

30

 

14

erase(3)

13

 

15

getBestUsers()

{“aaa”, “ccc”, “bbb”, “ddd”, “fff”}

[Fig. 4]

16

erase(6)

0

 

17

commentTo(“ccc”, 20, 2, 35)

40

 

18

commentTo(“fff”, 30, 9 , 14)

15

 

19

getBestMessages()

{2, 8, 9, 1, 7}

[Fig. 5]

20

getBestUsers()

{“ccc”, “aaa”, “bbb”, “fff”, “ddd”}

[Fig. 5]

                                                                     [Table 1]

 

[Fig. 2] shows the sum of points of users when function getBestUsers() is called in order 7. The number in parenthesis in [Fig. 2] means the point.



 

[Fig. 3] shows the sum of points of posts when function getBestMessages() is called in order 11.



 

[Fig. 4] shows the sum of points of users when function getBestUsers() is called in order 15.



 

[Fig. 5] shows the sum of points of posts when function getBestMessages() is called in order 19 and the sum of points of users when function getBestUsers() is called in order 20.



 

 [Constraints]

1. For each test case, init() is called once in the beginning.

2. For each test case, the number of users is less than or equal to 10,000.

3. For each test case, all functions may be called up to 50,000 times.






25 100
20
100
200 aaa 1 10 10
200 bbb 2 5 5
300 ccc 3 1 5 15
300 ddd 4 1 3 18
300 eee 5 3 4 22
600 aaa bbb ccc eee ddd
200 ccc 6 20 25
200 bbb 7 13 18
200 aaa 8 20 30
500 1 6 8 7 2
200 fff 9 1 1
300 ddd 10 6 10 30
400 3 13
600 aaa ccc bbb ddd fff
400 6 0
300 ccc 20 2 35 40
300 fff 30 9 14 15
500 2 8 9 1 7
600 ccc aaa bbb fff ddd
27
100
200 t 424 9 9
200 mpky 7 7 7
300 l 492 7 1 8
300 p 860451 424 6 15
300 hv 2158753 860451 2 17
300 t 8225355 492 1 9
300 hv 9 860451 2 19
200 kzwgyt 56 9 9
200 mpky 90388 6 13
400 492 7
600 mpky kzwgyt t p hv
200 geur 905 1 1
200 geur 558 1 2
500 424 56 7 90388 558
300 mpky 532037 90388 6 12
300 geur 4380 532037 8 20
300 kzwgyt 580534984 905 5 6
200 l 12838 4 4
300 p 95050 90388 6 26
200 kzwgyt 81 1 15
300 zfu 2 424 8 27
400 12838 0
200 mpky 110748 1 20
200 xp 88696 3 3
500 424 90388 56 7 905
600 mpky kzwgyt p geur t
30
100
200 aacavqgdp 7 5 5
300 lrqnbomnee 142 7 1 6
200 wcupanr 43067 7 7
400 43067 0
200 spov 8164 7 7
200 aacavqgdp 908 4 9
300 dcwu 2776 8164 6 13
300 rremgki 133402 908 1 5
300 f 86721532 8164 9 22
300 eahtiqa 966012 2776 4 26
300 f 99108 7 6 12
200 wcupanr 515 4 4
200 rremgki 17057588 4 5
200 dcwu 326332 5 11
200 cxoba 71 1 1
600 f dcwu aacavqgdp spov rremgki
400 71 0
300 ywb 8078 326332 7 12
500 8164 7 326332 908 515
200 cxoba 2 7 7
300 lrqnbomnee 53670 8164 2 28
300 f 9 8078 4 16
200 eahtiqa 4 5 9
200 eahtiqa 1 4 13
300 lrqnbomnee 5165 2 9 16
400 966012 24
300 wcupanr 70 99108 6 18
500 8164 7 2 326332 4
600 f lrqnbomnee dcwu wcupanr aacavqgdp