Repository navigation
Expand file tree
/
Copy pathdummy-data.json
More file actions
1 lines (1 loc) · 72.7 KB
/
Copy pathdummy-data.json
File metadata and controls
1 lines (1 loc) · 72.7 KB
1
[{"model": "admin.logentry", "pk": 1, "fields": {"action_time": "2024-12-08T09:22:23.266Z", "user": 1, "content_type": 13, "object_id": "1", "object_repr": "3. kolo 1. čast 46. ročník KMS", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 2, "fields": {"action_time": "2024-12-08T09:22:44.111Z", "user": 1, "content_type": 13, "object_id": "2", "object_repr": "2. kolo 1. čast 46. ročník KMS", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 3, "fields": {"action_time": "2024-12-08T09:23:17.007Z", "user": 1, "content_type": 14, "object_id": "1", "object_repr": "Kráľov Môžeme Striedať(0)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 4, "fields": {"action_time": "2024-12-08T09:29:47.336Z", "user": 1, "content_type": 14, "object_id": "1", "object_repr": "Základné zručnosti(0)", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Name\"]}}, {\"added\": {\"name\": \"text\", \"object\": \"Z\\u00e1kladn\\u00e9 zru\\u010dnosti(0)(PS)\"}}, {\"added\": {\"name\": \"text\", \"object\": \"Z\\u00e1kladn\\u00e9 zru\\u010dnosti(0)(ES)\"}}]"}}, {"model": "admin.logentry", "pk": 5, "fields": {"action_time": "2024-12-08T09:30:24.368Z", "user": 1, "content_type": 14, "object_id": "2", "object_repr": "A sme doma(1)", "action_flag": 1, "change_message": "[{\"added\": {}}, {\"added\": {\"name\": \"text\", \"object\": \"A sme doma(1)(PS)\"}}, {\"added\": {\"name\": \"text\", \"object\": \"A sme doma(1)(ES)\"}}]"}}, {"model": "admin.logentry", "pk": 6, "fields": {"action_time": "2024-12-08T09:31:09.060Z", "user": 1, "content_type": 14, "object_id": "3", "object_repr": "Stankova dilema(2)", "action_flag": 1, "change_message": "[{\"added\": {}}, {\"added\": {\"name\": \"text\", \"object\": \"Stankova dilema(2)(PS)\"}}, {\"added\": {\"name\": \"text\", \"object\": \"Stankova dilema(2)(ES)\"}}]"}}, {"model": "admin.logentry", "pk": 7, "fields": {"action_time": "2024-12-08T09:32:04.812Z", "user": 1, "content_type": 14, "object_id": "4", "object_repr": "Školské pomôcky(4)", "action_flag": 1, "change_message": "[{\"added\": {}}, {\"added\": {\"name\": \"text\", \"object\": \"\\u0160kolsk\\u00e9 pom\\u00f4cky(4)(PS)\"}}, {\"added\": {\"name\": \"text\", \"object\": \"\\u0160kolsk\\u00e9 pom\\u00f4cky(4)(ES)\"}}]"}}, {"model": "admin.logentry", "pk": 8, "fields": {"action_time": "2024-12-08T09:32:14.804Z", "user": 1, "content_type": 14, "object_id": "1", "object_repr": "Základné zručnosti(1)", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Number\"]}}]"}}, {"model": "admin.logentry", "pk": 9, "fields": {"action_time": "2024-12-08T09:32:20.697Z", "user": 1, "content_type": 14, "object_id": "1", "object_repr": "Základné zručnosti(2)", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Number\"]}}]"}}, {"model": "admin.logentry", "pk": 10, "fields": {"action_time": "2024-12-08T09:32:25.531Z", "user": 1, "content_type": 14, "object_id": "1", "object_repr": "Základné zručnosti(3)", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Number\"]}}]"}}, {"model": "admin.logentry", "pk": 11, "fields": {"action_time": "2024-12-08T09:33:37.617Z", "user": 1, "content_type": 14, "object_id": "5", "object_repr": "Koho ešte nepoznám?(1)", "action_flag": 1, "change_message": "[{\"added\": {}}, {\"added\": {\"name\": \"text\", \"object\": \"Koho e\\u0161te nepozn\\u00e1m?(1)(PS)\"}}, {\"added\": {\"name\": \"text\", \"object\": \"Koho e\\u0161te nepozn\\u00e1m?(1)(ES)\"}}]"}}, {"model": "admin.logentry", "pk": 12, "fields": {"action_time": "2024-12-08T09:34:21.080Z", "user": 1, "content_type": 14, "object_id": "6", "object_repr": "Oči veľké(2)", "action_flag": 1, "change_message": "[{\"added\": {}}, {\"added\": {\"name\": \"text\", \"object\": \"O\\u010di ve\\u013ek\\u00e9(2)(PS)\"}}, {\"added\": {\"name\": \"text\", \"object\": \"O\\u010di ve\\u013ek\\u00e9(2)(ES)\"}}]"}}, {"model": "admin.logentry", "pk": 13, "fields": {"action_time": "2024-12-08T09:35:03.950Z", "user": 1, "content_type": 14, "object_id": "5", "object_repr": "Koho ešte nepoznám?(1)", "action_flag": 2, "change_message": "[{\"changed\": {\"name\": \"text\", \"object\": \"Koho e\\u0161te nepozn\\u00e1m?(1)(PS)\", \"fields\": [\"Type\"]}}, {\"changed\": {\"name\": \"text\", \"object\": \"Koho e\\u0161te nepozn\\u00e1m?(1)(ES)\", \"fields\": [\"Type\"]}}]"}}, {"model": "admin.logentry", "pk": 14, "fields": {"action_time": "2024-12-08T09:35:39.754Z", "user": 1, "content_type": 14, "object_id": "2", "object_repr": "A sme doma(1)", "action_flag": 2, "change_message": "[{\"changed\": {\"name\": \"text\", \"object\": \"A sme doma(1)(PS)\", \"fields\": [\"Type\"]}}, {\"changed\": {\"name\": \"text\", \"object\": \"A sme doma(1)(ES)\", \"fields\": [\"Type\"]}}]"}}, {"model": "admin.logentry", "pk": 15, "fields": {"action_time": "2024-12-08T09:35:49.947Z", "user": 1, "content_type": 14, "object_id": "4", "object_repr": "Školské pomôcky(4)", "action_flag": 2, "change_message": "[{\"changed\": {\"name\": \"text\", \"object\": \"\\u0160kolsk\\u00e9 pom\\u00f4cky(4)(PS)\", \"fields\": [\"Type\"]}}, {\"changed\": {\"name\": \"text\", \"object\": \"\\u0160kolsk\\u00e9 pom\\u00f4cky(4)(ES)\", \"fields\": [\"Type\"]}}]"}}, {"model": "admin.logentry", "pk": 16, "fields": {"action_time": "2024-12-08T09:36:36.393Z", "user": 1, "content_type": 14, "object_id": "3", "object_repr": "Stankova dilema(2)", "action_flag": 2, "change_message": "[{\"changed\": {\"name\": \"text\", \"object\": \"Stankova dilema(2)(PS)\", \"fields\": [\"Type\"]}}, {\"changed\": {\"name\": \"text\", \"object\": \"Stankova dilema(2)(ES)\", \"fields\": [\"Type\"]}}]"}}, {"model": "admin.logentry", "pk": 17, "fields": {"action_time": "2024-12-08T09:38:30.858Z", "user": 1, "content_type": 8, "object_id": "2", "object_repr": "user", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Staff status\", \"Superuser status\"]}}]"}}, {"model": "admin.logentry", "pk": 18, "fields": {"action_time": "2024-12-08T09:38:54.118Z", "user": 1, "content_type": 6, "object_id": "1", "object_repr": "1", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 19, "fields": {"action_time": "2024-12-08T09:38:56.693Z", "user": 1, "content_type": 6, "object_id": "2", "object_repr": "2", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 20, "fields": {"action_time": "2024-12-08T09:39:09.866Z", "user": 1, "content_type": 7, "object_id": "1", "object_repr": "FMFI", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 21, "fields": {"action_time": "2024-12-08T09:39:20.642Z", "user": 1, "content_type": 7, "object_id": "2", "object_repr": "PRIF", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 22, "fields": {"action_time": "2024-12-08T09:39:53.726Z", "user": 1, "content_type": 9, "object_id": "1", "object_repr": "user (2SS)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 23, "fields": {"action_time": "2024-12-08T09:40:16.415Z", "user": 1, "content_type": 9, "object_id": "2", "object_repr": "user (1SS)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 24, "fields": {"action_time": "2024-12-08T09:41:36.696Z", "user": 1, "content_type": 10, "object_id": "1", "object_repr": "Základné zručnosti(3) (user)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 25, "fields": {"action_time": "2024-12-08T09:42:15.811Z", "user": 1, "content_type": 10, "object_id": "2", "object_repr": "Školské pomôcky(4) (user)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 26, "fields": {"action_time": "2024-12-08T09:43:35.926Z", "user": 1, "content_type": 10, "object_id": "3", "object_repr": "Koho ešte nepoznám?(1) (user)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 27, "fields": {"action_time": "2024-12-08T10:05:52.823Z", "user": 1, "content_type": 18, "object_id": "3", "object_repr": "Level 1", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Name\", \"Identifier\"]}}]"}}, {"model": "admin.logentry", "pk": 28, "fields": {"action_time": "2024-12-08T10:06:20.709Z", "user": 1, "content_type": 17, "object_id": "3", "object_repr": "Korešpondenčný matematický seminár", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Name\", \"Short name\"]}}]"}}, {"model": "admin.logentry", "pk": 29, "fields": {"action_time": "2024-12-08T10:06:30.411Z", "user": 1, "content_type": 18, "object_id": "2", "object_repr": "Level 2", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Name\", \"Identifier\"]}}]"}}, {"model": "admin.logentry", "pk": 30, "fields": {"action_time": "2024-12-08T11:39:28.980Z", "user": 1, "content_type": 8, "object_id": "2", "object_repr": "user", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Staff status\"]}}]"}}, {"model": "admin.logentry", "pk": 31, "fields": {"action_time": "2024-12-08T11:42:27.892Z", "user": 1, "content_type": 12, "object_id": "1", "object_repr": "Koho ešte nepoznám?(1) (user)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 32, "fields": {"action_time": "2024-12-08T12:35:46.269Z", "user": 1, "content_type": 10, "object_id": "4", "object_repr": "Koho ešte nepoznám?(1) (user)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 33, "fields": {"action_time": "2024-12-08T12:36:42.570Z", "user": 1, "content_type": 10, "object_id": "4", "object_repr": "Koho ešte nepoznám?(1) (user)", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"File\"]}}]"}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add log entry", "content_type": 1, "codename": "add_logentry"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change log entry", "content_type": 1, "codename": "change_logentry"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete log entry", "content_type": 1, "codename": "delete_logentry"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can view log entry", "content_type": 1, "codename": "view_logentry"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can add permission", "content_type": 2, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can change permission", "content_type": 2, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can delete permission", "content_type": 2, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can view permission", "content_type": 2, "codename": "view_permission"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can add group", "content_type": 3, "codename": "add_group"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can change group", "content_type": 3, "codename": "change_group"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can delete group", "content_type": 3, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can view group", "content_type": 3, "codename": "view_group"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add content type", "content_type": 4, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change content type", "content_type": 4, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete content type", "content_type": 4, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can view content type", "content_type": 4, "codename": "view_contenttype"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can add session", "content_type": 5, "codename": "add_session"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can change session", "content_type": 5, "codename": "change_session"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can delete session", "content_type": 5, "codename": "delete_session"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can view session", "content_type": 5, "codename": "view_session"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can add category", "content_type": 6, "codename": "add_category"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can change category", "content_type": 6, "codename": "change_category"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can delete category", "content_type": 6, "codename": "delete_category"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can view category", "content_type": 6, "codename": "view_category"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add school", "content_type": 7, "codename": "add_school"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change school", "content_type": 7, "codename": "change_school"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete school", "content_type": 7, "codename": "delete_school"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can view school", "content_type": 7, "codename": "view_school"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can add user", "content_type": 8, "codename": "add_user"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can change user", "content_type": 8, "codename": "change_user"}}, {"model": "auth.permission", "pk": 31, "fields": {"name": "Can delete user", "content_type": 8, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 32, "fields": {"name": "Can view user", "content_type": 8, "codename": "view_user"}}, {"model": "auth.permission", "pk": 33, "fields": {"name": "Can add enrollment", "content_type": 9, "codename": "add_enrollment"}}, {"model": "auth.permission", "pk": 34, "fields": {"name": "Can change enrollment", "content_type": 9, "codename": "change_enrollment"}}, {"model": "auth.permission", "pk": 35, "fields": {"name": "Can delete enrollment", "content_type": 9, "codename": "delete_enrollment"}}, {"model": "auth.permission", "pk": 36, "fields": {"name": "Can view enrollment", "content_type": 9, "codename": "view_enrollment"}}, {"model": "auth.permission", "pk": 37, "fields": {"name": "Can add file submit", "content_type": 10, "codename": "add_filesubmit"}}, {"model": "auth.permission", "pk": 38, "fields": {"name": "Can change file submit", "content_type": 10, "codename": "change_filesubmit"}}, {"model": "auth.permission", "pk": 39, "fields": {"name": "Can delete file submit", "content_type": 10, "codename": "delete_filesubmit"}}, {"model": "auth.permission", "pk": 40, "fields": {"name": "Can view file submit", "content_type": 10, "codename": "view_filesubmit"}}, {"model": "auth.permission", "pk": 41, "fields": {"name": "Can add judge submit", "content_type": 11, "codename": "add_judgesubmit"}}, {"model": "auth.permission", "pk": 42, "fields": {"name": "Can change judge submit", "content_type": 11, "codename": "change_judgesubmit"}}, {"model": "auth.permission", "pk": 43, "fields": {"name": "Can delete judge submit", "content_type": 11, "codename": "delete_judgesubmit"}}, {"model": "auth.permission", "pk": 44, "fields": {"name": "Can view judge submit", "content_type": 11, "codename": "view_judgesubmit"}}, {"model": "auth.permission", "pk": 45, "fields": {"name": "Can add text submit", "content_type": 12, "codename": "add_textsubmit"}}, {"model": "auth.permission", "pk": 46, "fields": {"name": "Can change text submit", "content_type": 12, "codename": "change_textsubmit"}}, {"model": "auth.permission", "pk": 47, "fields": {"name": "Can delete text submit", "content_type": 12, "codename": "delete_textsubmit"}}, {"model": "auth.permission", "pk": 48, "fields": {"name": "Can view text submit", "content_type": 12, "codename": "view_textsubmit"}}, {"model": "auth.permission", "pk": 49, "fields": {"name": "Can add problem set", "content_type": 13, "codename": "add_problemset"}}, {"model": "auth.permission", "pk": 50, "fields": {"name": "Can change problem set", "content_type": 13, "codename": "change_problemset"}}, {"model": "auth.permission", "pk": 51, "fields": {"name": "Can delete problem set", "content_type": 13, "codename": "delete_problemset"}}, {"model": "auth.permission", "pk": 52, "fields": {"name": "Can view problem set", "content_type": 13, "codename": "view_problemset"}}, {"model": "auth.permission", "pk": 53, "fields": {"name": "Can add problem", "content_type": 14, "codename": "add_problem"}}, {"model": "auth.permission", "pk": 54, "fields": {"name": "Can change problem", "content_type": 14, "codename": "change_problem"}}, {"model": "auth.permission", "pk": 55, "fields": {"name": "Can delete problem", "content_type": 14, "codename": "delete_problem"}}, {"model": "auth.permission", "pk": 56, "fields": {"name": "Can view problem", "content_type": 14, "codename": "view_problem"}}, {"model": "auth.permission", "pk": 57, "fields": {"name": "Can add text", "content_type": 15, "codename": "add_text"}}, {"model": "auth.permission", "pk": 58, "fields": {"name": "Can change text", "content_type": 15, "codename": "change_text"}}, {"model": "auth.permission", "pk": 59, "fields": {"name": "Can delete text", "content_type": 15, "codename": "delete_text"}}, {"model": "auth.permission", "pk": 60, "fields": {"name": "Can view text", "content_type": 15, "codename": "view_text"}}, {"model": "auth.permission", "pk": 61, "fields": {"name": "Can add site", "content_type": 16, "codename": "add_site"}}, {"model": "auth.permission", "pk": 62, "fields": {"name": "Can change site", "content_type": 16, "codename": "change_site"}}, {"model": "auth.permission", "pk": 63, "fields": {"name": "Can delete site", "content_type": 16, "codename": "delete_site"}}, {"model": "auth.permission", "pk": 64, "fields": {"name": "Can view site", "content_type": 16, "codename": "view_site"}}, {"model": "auth.permission", "pk": 65, "fields": {"name": "Can add contest", "content_type": 17, "codename": "add_contest"}}, {"model": "auth.permission", "pk": 66, "fields": {"name": "Can change contest", "content_type": 17, "codename": "change_contest"}}, {"model": "auth.permission", "pk": 67, "fields": {"name": "Can delete contest", "content_type": 17, "codename": "delete_contest"}}, {"model": "auth.permission", "pk": 68, "fields": {"name": "Can view contest", "content_type": 17, "codename": "view_contest"}}, {"model": "auth.permission", "pk": 69, "fields": {"name": "Can add category", "content_type": 18, "codename": "add_category"}}, {"model": "auth.permission", "pk": 70, "fields": {"name": "Can change category", "content_type": 18, "codename": "change_category"}}, {"model": "auth.permission", "pk": 71, "fields": {"name": "Can delete category", "content_type": 18, "codename": "delete_category"}}, {"model": "auth.permission", "pk": 72, "fields": {"name": "Can view category", "content_type": 18, "codename": "view_category"}}, {"model": "contenttypes.contenttype", "pk": 1, "fields": {"app_label": "admin", "model": "logentry"}}, {"model": "contenttypes.contenttype", "pk": 2, "fields": {"app_label": "auth", "model": "permission"}}, {"model": "contenttypes.contenttype", "pk": 3, "fields": {"app_label": "auth", "model": "group"}}, {"model": "contenttypes.contenttype", "pk": 4, "fields": {"app_label": "contenttypes", "model": "contenttype"}}, {"model": "contenttypes.contenttype", "pk": 5, "fields": {"app_label": "sessions", "model": "session"}}, {"model": "contenttypes.contenttype", "pk": 6, "fields": {"app_label": "users", "model": "category"}}, {"model": "contenttypes.contenttype", "pk": 7, "fields": {"app_label": "users", "model": "school"}}, {"model": "contenttypes.contenttype", "pk": 8, "fields": {"app_label": "users", "model": "user"}}, {"model": "contenttypes.contenttype", "pk": 9, "fields": {"app_label": "users", "model": "enrollment"}}, {"model": "contenttypes.contenttype", "pk": 10, "fields": {"app_label": "submits", "model": "filesubmit"}}, {"model": "contenttypes.contenttype", "pk": 11, "fields": {"app_label": "submits", "model": "judgesubmit"}}, {"model": "contenttypes.contenttype", "pk": 12, "fields": {"app_label": "submits", "model": "textsubmit"}}, {"model": "contenttypes.contenttype", "pk": 13, "fields": {"app_label": "problems", "model": "problemset"}}, {"model": "contenttypes.contenttype", "pk": 14, "fields": {"app_label": "problems", "model": "problem"}}, {"model": "contenttypes.contenttype", "pk": 15, "fields": {"app_label": "problems", "model": "text"}}, {"model": "contenttypes.contenttype", "pk": 16, "fields": {"app_label": "sites", "model": "site"}}, {"model": "contenttypes.contenttype", "pk": 17, "fields": {"app_label": "contests", "model": "contest"}}, {"model": "contenttypes.contenttype", "pk": 18, "fields": {"app_label": "contests", "model": "category"}}, {"model": "sessions.session", "pk": "5uuakeqz7iam4quyrh8wftis1s7zmhsi", "fields": {"session_data": ".eJxVjMsOwiAUBf-FtSFwebt0328gXB5SNZCUdmX8d9ukC92emTlv4sO2Vr-NvPg5kSsBcvndMMRnbgdIj9Duncbe1mVGeij0pINOPeXX7XT_DmoYda-z4FKyzAQolEWZFIsrwWVlQCZhjONRW8X1LjiQgAGZtRE5aIiSISOfL8UFNtM:1tKGoA:mDs5J9gFxxsX9_jRXmob3-D1hVoR0C3_5kSZjWuhuZ4", "expire_date": "2024-12-22T12:54:46.620Z"}}, {"model": "sessions.session", "pk": "k8kiyugt5l0pip3fssv3nw8besi25ucm", "fields": {"session_data": ".eJxVjE0OwiAYBe_C2hCQ8ufSfc9A-HggVUOT0q6Md9cmXej2zcx7sRC3tYat5yVMYBcm2el3o5geue0A99huM09zW5eJ-K7wg3Y-zsjP6-H-HdTY67f2FJ3J2RcpDZweSklwBCgID5GcKBbZC6OdIGtUcVaRVACIzkORmr0_CBE4pQ:1tKGeE:G_XrVg68t5zVSh87jdTsB77hZPiPYe1FKuiE5GH02P0", "expire_date": "2024-12-22T12:44:30.133Z"}}, {"model": "sites.site", "pk": 1, "fields": {"domain": "localhost", "name": ""}}, {"model": "users.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$870000$zogSd7EtB3IxFDKJbODYEF$Cq9JBHAg+oFMEvg1T5vYmQ+AgVzBAg3mcR2tPd7PqU4=", "last_login": "2024-12-08T12:44:30.131Z", "is_superuser": true, "username": "admin", "first_name": "", "last_name": "", "email": "admin@admin.com", "is_staff": true, "is_active": true, "date_joined": "2024-12-08T09:20:23.598Z", "groups": [], "user_permissions": []}}, {"model": "users.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$870000$Q6TPji7ssy9b7TrZmv5YeC$JqDGgTEhFx63uTmyr3JSn+Rjg1Y8bn2hpx3U7o923Ng=", "last_login": "2024-12-08T12:54:46.618Z", "is_superuser": false, "username": "user", "first_name": "", "last_name": "", "email": "user@user.com", "is_staff": true, "is_active": true, "date_joined": "2024-12-08T09:38:08Z", "groups": [], "user_permissions": []}}, {"model": "users.school", "pk": 1, "fields": {"name": "FMFI", "short_name": "FMFI", "edu_id": "0", "address": "FMFI"}}, {"model": "users.school", "pk": 2, "fields": {"name": "PRIF", "short_name": "PRIF", "edu_id": "1", "address": "PRIF"}}, {"model": "users.enrollment", "pk": 1, "fields": {"problem_set": 1, "user": 2, "school": 1, "grade": "2SS", "category": 2}}, {"model": "users.enrollment", "pk": 2, "fields": {"problem_set": 2, "user": 2, "school": 1, "grade": "1SS", "category": 2}}, {"model": "submits.filesubmit", "pk": 1, "fields": {"enrollment": 1, "problem": 1, "created_at": "2024-12-08T09:41:36.676Z", "score": "20.00", "scored_by": 1, "comment": "ok", "file": "submits/1/2_829c2f52576ed9a3.pdf", "comment_file": ""}}, {"model": "submits.filesubmit", "pk": 2, "fields": {"enrollment": 1, "problem": 4, "created_at": "2024-12-08T09:42:15.809Z", "score": null, "scored_by": null, "comment": "", "file": "submits/4/2_0961cc2f8a75f242.pdf", "comment_file": ""}}, {"model": "submits.filesubmit", "pk": 3, "fields": {"enrollment": 2, "problem": 5, "created_at": "2024-12-08T09:43:35.924Z", "score": "5.00", "scored_by": 1, "comment": "nic moc", "file": "submits/5/2_6b7cade65aaa2555.pdf", "comment_file": ""}}, {"model": "submits.filesubmit", "pk": 4, "fields": {"enrollment": 2, "problem": 5, "created_at": "2024-12-08T12:35:46.260Z", "score": null, "scored_by": null, "comment": "", "file": "submits/5/2_a2fcd4a968de2328.pdf", "comment_file": ""}}, {"model": "submits.textsubmit", "pk": 1, "fields": {"enrollment": 2, "problem": 5, "created_at": "2024-12-08T11:42:27.881Z", "score": null, "scored_by": null, "comment": "", "value": "Testings"}}, {"model": "problems.problemset", "pk": 1, "fields": {"contest": 3, "name": "3. kolo 1. čast 46. ročník KMS", "start_date": "2024-11-08", "end_date": "2024-12-30"}}, {"model": "problems.problemset", "pk": 2, "fields": {"contest": 3, "name": "2. kolo 1. čast 46. ročník KMS", "start_date": "2024-09-08", "end_date": "2024-11-07"}}, {"model": "problems.problem", "pk": 1, "fields": {"name": "Základné zručnosti", "number": 3, "problem_set": 1}}, {"model": "problems.problem", "pk": 2, "fields": {"name": "A sme doma", "number": 1, "problem_set": 1}}, {"model": "problems.problem", "pk": 3, "fields": {"name": "Stankova dilema", "number": 2, "problem_set": 1}}, {"model": "problems.problem", "pk": 4, "fields": {"name": "Školské pomôcky", "number": 4, "problem_set": 1}}, {"model": "problems.problem", "pk": 5, "fields": {"name": "Koho ešte nepoznám?", "number": 1, "problem_set": 2}}, {"model": "problems.problem", "pk": 6, "fields": {"name": "Oči veľké", "number": 2, "problem_set": 2}}, {"model": "problems.text", "pk": 1, "fields": {"text": "# Základné zručnosti {bodypopis=12 bodyprogram=8}\r\n%by kristiiina\r\n%proofread <niektoiny>\r\n\r\nMisQo sedí v školskej lavici a rozvíja svoju jemnú motoriku búchaním jednej fixky o druhú. To ho po čase omrzí a rozhodne\r\nsa zabaviť sa niečím iným. Na lavici má položenú kopu ceruziek. Každá je zastrúhaná do rôznej dĺžky. Vezme lepidlo a ceruzky\r\nzačne lepiť o seba a vyrábať z nich rebrík.\r\n\r\n\"Koľko najviac stupienkov vlastne môže mať ten rebrík?\", hovorí si.\r\n\r\nNechce sa mu ale nad tým rozmýšľať, skúste to teda zistiť zaňho.\r\n\r\n## Úloha\r\n\r\nNa výrobu rebríka s $k$ stupienkami potrebuje MisQo $k+2$ ceruziek, ktoré použije takto:\r\n\r\n- Dve ceruzky s dĺžkou aspoň $k+1$ použije ako boky rebríka, na ktoré bude lepiť stupienky.\r\n- Na stupienky potrebuje ďalších $k$ ceruziek s dĺžkou aspoň $1$, pričom širšie ceruzky budú z rebríka vytŕčať.\r\n- Medzi jednotlivými stupienkami budú rozostupy dĺžky 1, pričom aj prvý a posledný stupienok\r\nmusia mať od koncov bočných ceruziek vzdialenosť aspoň 1.\r\n\r\nNajlepšie to celé pochopíte na obrázku:\r\n\r\n@L \\includegraphics[width=0.8\\textwidth]{prikl1/ceruzky.png}\\hfill\r\n@H <img src='obrazky/prikl1/ceruzky.png' width=80%/>\r\n\r\nNa prvý rebrík použil MisQo dve ceruzky dĺžky 3 ako boky a dve ceruzky dĺžky 1 ako stupienky.\r\nAj druhý rebrík je vyrobený správne -- boky sú znova z dvoch ceruziek dĺžky 3, stupienok je jedna ceruzka dĺžky 2.\r\nNa poslednom rebríku vidíme, že ceruzky môžu mať navzájom rôzne dĺžky -- v tomto prípade 3 a 10[^1] na boky\r\na 2 a 3 na stupienky.\r\n\r\nVašou úlohou je zistiť najväčší počet stupienkov rebríka, ktorý vie Miško vyrobiť takýmto spôsobom.\r\n\r\n## Formát vstupu\r\n\r\nV prvom riadku vstupu je číslo $n$ ($1 \\leq n \\leq 10^5$) udávajúce počet ceruziek. Ďalej nasleduje $n$\r\nriadkov -- každý z nich obsahuje jedno celé číslo $a_i$, ktoré zodpovedá dĺžke $i$-tej ceruzky, pričom platí\r\n$1 \\leq a_i \\leq 10^6$.\r\n\r\n## Formát výstupu\r\n\r\nVypíš jeden riadok a v ňom jedno celé číslo $k$ - najväčší počet stupienkov rebríka, ktorý vie Miško vyrobiť.\r\nAk sa nedá z ceruziek postaviť žiadny rebrík, vypíš nulu.\r\n\r\n## Príklad\r\n\r\n```vstup\r\n5\r\n6 \r\n1\r\n4\r\n8\r\n2\r\n```\r\n\r\n```vystup\r\n3\r\n```\r\n\r\n*Ako základ rebríka použijeme dve najdlhšie ceruzky s dĺžkou 8 a 6. Zostanú nám 3 ceruzky, ktoré na tie zvislé\r\nvieme prilepiť. Rebrík teda bude mať 3 stupienky.*\r\n\r\n```vstup\r\n4\r\n2\r\n1\r\n2\r\n1\r\n```\r\n\r\n```vystup\r\n1\r\n```\r\n\r\n*Ak si vyberieme ceruzky dĺžky 2 ako základ rebríka, ostanú nám dve ceruzky dĺžky 1 na stupienky. Z nich\r\nale vieme použiť iba jednu, keďže boky rebríka sú príliš krátke.*\r\n\r\n[^1]: Hups, tá sa nám do obrázka nevošla...", "type": "PS", "problem": 1}}, {"model": "problems.text", "pk": 2, "fields": {"text": "# Základné zručnosti {vzorak=\"Michal Staník\" mail=\"michal.stanik@trojsten.sk\" bodypopis=12 bodyprogram=8}\r\n%by michalstanik1\r\n%proofread fezjo\r\n\r\nMôžeme si všimnúť, že nezáleží na tom, ktoré ceruzky použije MisQo na stupienky,\r\npretože o každej vieme, že má dĺžku aspoň $1$ (garantuje nám to zadanie)\r\na žiadne iné obmedzenia na ne nemáme.\r\n\r\nBočné ceruzky chceme mať čo najdlhšie, aby sme mohli mať potenciálne čo najdlhší rebrík.\r\nKeďže je nám jedno, ktoré ceruzky budú stupienky,\r\nje najlepšie použiť dve najdlhšie ceruzky zo vstupu ako bočné,\r\nnikde inde nám tieto dlhé ceruzky chýbať nebudú.\r\n\r\nNajväčšia možná dĺžka rebríka je potom daná dĺžkou kratšej z dvoch najdlhších ceruziek\r\n-- ak má druhá najdlhšia ceruzka zo vstupu dĺžku $l$, tak najdlhší možný rebrík\r\nmá $l-1$ stupienkov.\r\n\r\nDruhá vec, ktorá nás obmedzuje, je celkový počet ceruziek. MisQo nemôže postaviť rebrík\r\ns viac ako $n-2$ stupienkami (ktoré mu ostali po odložení dvoch bočných ceruziek).\r\n\r\nObe obmedzenia platia súčasne, teda vezmeme minimum z ich hodnôt.\r\nAk je $n=1$, druhá najdlhšia ceruzka neexistuje -- tento prípad vyriešime osobitne a vypíšeme preň $0$ -- žiaden rebrík sa postaviť nedá.\r\n\r\nCelé riešenie vieme implementovať v čase lineárnom od počtu ceruziek: $O(n)$.\r\nStačí nám dvakrát prejsť celý zoznam dĺžok a vypočítať zopár porovnaní.\r\n\r\n% Uncomment listings only after doprogramovavanie is finished.\r\n\\listing{prikl1/vstupy/sol-michals.py}\r\n\r\nPre pohodlnejšiu implementáciu najskôr nájdeme maximum dĺžok ceruziek,\r\nodstránime ho zo zoznamu pomocou funkcie `remove` a nájdeme maximum zostávajúcich dĺžok,\r\nktoré je druhou najväčšou dĺžkou ceruzky. Je dôležité mať na pamäti,\r\nže funkcia `remove` má lineárnu zložitosť voči dĺžke zoznamu, pretože\r\nvšetky prvky za odstraňovaným prvkom sa musia posunúť o jednu pozíciu doľava v zozname\r\na týchto prvkov môže byť až $O(n)$. Tu na tom nezáleží, pretože aj tak robíme\r\nlineárne hľadanie maxima. Avšak neopatrné volanie funkcie `remove` (napr. opakovane v cykle)\r\nmôže často zhoršiť zložitosť algoritmu, a preto na to treba myslieť.\r\n\r\nÚloha sa dá implementovať v čase $O(n)$ aj s konštantnou pamäťovou zložitosťou,\r\nnepotrebujeme si totiž pamätať celý zoznam ceruziek, ale stačia nám iba aktuálne dve najdlhšie a celkový počet ceruziek.\r\n\r\n\\listing{prikl1/vstupy/sol.py}", "type": "ES", "problem": 1}}, {"model": "problems.text", "pk": 3, "fields": {"text": "# A sme doma {vzorak=\"Vašino\" mail=\"samuel.vasko@trojsten.sk\" bodypopis=12 bodyprogram=8}\r\n%by Vašino\r\n%proofread by Sabinka, fezjo\r\n\r\n\r\n## Prechádzanie poschodiami od z do k (Počet bodov: 4/8)\r\nPredpokladajme, že Vašino ide postupne, po jednom, od najnižšieho poschodia $z$ po najvyššie $k$. V tomto prípade, vždy keď príde na nejaké poschodie (dokopy $n$-krát), rozhoduje sa, či cez neho môže prejsť. Rozhodovanie znamená, že sa pozrie do poľa veľkosti $p$, v ktorom sú uložené čísla mysterióznych poschodí, či sa tam dané poschodie nachádza. Toto overenie mu vždy trvá $O(p)$ operácií. Ak zistí, že sa tam aktuálne poschodie nenachádza, vie, že dovtedajší súvislý úsek nemysterióznych poschodí môže zvýšiť o 1. Inak musí dĺžku znulovať. Z takto napočítaných úsekov si vyberie najdlhší. Časová zložitosť bude $O(n) + n \\cdot O(p)$, čo je $O(n \\cdot p)$.\r\nPamäťová zložitosť je $O(p)$, nakoľko si pamätáme pole mysterióznych poschodí.\r\n\r\n## Mysteriózne poschodia v množine (Počet bodov: 6/8)\r\nPostupujeme tak isto ako v predchádzajúcom riešení, len namiesto ukladania mysterióznych poschodí do poľa si ich ukladáme do dátovej štruktúry množina. Totiž overenie, či sa v množine nachádza nejaký prvok je v programovacích jazykoch zvyčajne implementované ako veľmi rýchla operácia. Dátová štruktúra `set` v Pythone a `std::unordered_set` v C++ túto operáciu podporujú v $O(1)$. Časová zložitosť teda bude len $O(n \\cdot 1) = O(n)$. Pamäťová zložitosť sa nezmenila.\r\n\r\n\\listing{prikl2/vstupy/sol-misq-6b.py}\r\n\r\n\r\n## Optimálne riešenie (Počet bodov: 8/8)\r\nPoďme teraz vyriešiť druhý problém pôvodného riešenia, a to, že prechádzame cez všetky poschodia. Všimnime si, že počet mysterióznych poschodí je oveľa menší než celkový počet poschodí. Využime tento fakt v náš prospech.\r\n\r\nOpäť môžeme ísť zdola nahor. Keďže nemysteriózne poschodia nám cestu nekazia, nemusíme sa o ne zaujímať a môžeme ich preskočiť. Aby sme prechádzali mysetriózne poschodia naozaj v poradí zdola nahor, vopred si ich usporiadame od najmenšieho po najväčšie. Dva prvky vedľa seba potom znamenajú možnú súvislú dĺžku jazdy výťahom.\r\n\r\nNa zjednodušenie implementácie na úvod tohoto zoznamu pridáme $z-1$ a na záver $k+1$. Tieto čísla budú slúžiť ako zarážky, aby aj prípadné koncové úseky poschodí boli z oboch strán ohraničené mysterióznymi poschodiami. Uvedomme si, že aj keby jedno z týchto pridaných zarážkových poschodí bolo uvedené ako mysteriózne na vstupe, fungovanie programu nám to nepokazí.\r\n\r\nKaždý súvislý bezproblémový úsek je teraz ohraničený dvoma, v našom poli susednými, mysterióznymi poschodiami. Keďže chcem nájsť najdlhší úsek, porovnávame každé dve susedné mysterózne poschodia a zapisujeme si najväčší rozdiel, ktorý kedy nameriame. Odpoveď vypíšeme.\r\n\r\nRýchle triediace algoritmy ako napríklad quicksort alebo mergesort majú pre $n$ prvkov časovú zložitosť $O(n \\log n)$. My samozrejme použijeme vstavané triediace algoritmy našich jazykov, ktoré majú rovnakú časovú zložitosť. Jedno prejdenie a porovnanie susedov trvá $O(p)$, čo je zanedbateľné v porovnaní s náročnejšiou operáciou triedenia. Celková časová zložitosť je teda $O(p \\log p)$ -- $n$ sa nám zmenilo na $p$, avšak pribudol nám logaritmus (ale nezúfajte, vieme sa ho zbaviť!).\r\n\r\nPamäťová zložitosť stále zostáva $O(p)$, lebo rovnako ako v prvom riešení si udržiavame mysteriózne poschodia v poli dĺžky $p$.\r\n\r\n\\listing{prikl2/vstupy/sol-py-8b.py}\r\n\r\n\r\n## Riešenie v ideálnom svete (Počet bodov: 8/8)\r\nPre isté špeciálne prípady vstupov existujú aj rýchlejšie spôsoby usporiadavania prvkov ako v $O(p \\log p)$. Napríklad ak máme usporiadavať celé čísla v určenom rozsahu, môžeme použiť algoritmus bucket sort, ktorý to dokáže v čase $O(p)$. Viac o bucket sorte si môžeš prečítať napríklad [tu, na wiki](https://cs.wikipedia.org/wiki/P%C5%99ihr%C3%A1dkov%C3%A9_%C5%99azen%C3%AD). S jeho použitím vyriešime problém logaritmu a dostávame optimálnu časovú aj pamäťovú zložitosť $O(p)$ (lepšia nemôže byť kvôli veľkosti vstupu).\r\n\r\nAk si použil bucket sort, veľmi pravdepodobne si ale zistil, že kód ti bežal pomalšie než s použitím vstavaného sortu. To je normálne (štandardná knižnica sa poráža ťažko) a stále od nás dostávaš extra pochvalu.", "type": "ES", "problem": 2}}, {"model": "problems.text", "pk": 4, "fields": {"text": "# A sme doma... {bodypopis=12 bodyprogram=8}\r\n\r\n%by Vašino\r\n%proofread by Sabinka, MisQo, fezjo\r\n\r\nPo maturite riešil mladý Vašino zapeklitý problém - raz sa prázdniny skončia a bude treba ísť do školy. Teraz bol problém ešte zložitejší, lebo si vyberal, kam pôjde študovať. Situácia závažná, nakoniec sa ale rozhodol, že **MatFyz** je najlepšie miesto na študovanie informatiky na svete.\r\n\r\nHodil si mincou, či bude bývať na internáte alebo si pohľadá nejaký podnájom. Keďže padla hlava, bude musieť byť ďalší rok sociálnejší a zabývať sa na internáte.\r\n\r\nKeď Vašino pricestoval na intrák, najviac ho zaujal výťah vo výškovej budove. Všimol si, že niektoré poschodia sú vo výťahu špeciálne vyznačené. Hneď mu bolo jasné, že ide o nejaké **mysteriózne** poschodia. Keďže Vašino je len zmätený prvák, radšej by sa im vyhol. Zároveň má ale Vašino rád vozenie sa výťahom a tak chce zistiť, koľko najviac si vie užívať bezstarostnú jazdu, bez prechádzania cez takéto desivé poschodia. Inak povedané, koľko najviac poschodí po sebe sa vie viezť tak, aby neprešiel ani jedným mysterióznym poschodím. \r\n\r\n\r\n## Úloha\r\n\r\nVýťah vie klesnúť najviac na poschodie číslo $z$ (ako začiatočné) a ide hore až po poschodie číslo $k$ (ako konečné). Mysteriózne poschodia sú označené číslami z množiny celých čisel na tomto intervale.\r\n\r\nVašou úlohou je určiť, aký dlhý je najdlhší úsek po ceste zo $z$ do $k$ je taký, že na ňom neprejdeme cez žiadne mysteriózne poschodia. (Dĺžka úseku je počítaná ako počet nemysterióznych poschodí, ktoré cesta obsahuje. Teda sa tam počítajú aj začiatočné a konečné poschodie.)\r\n\r\n\r\n## Formát vstupu\r\n\r\nV prvom riadku sú dve hodnoty $z$ a $k$ oddelené medzerou ($1 \\leq z < k \\leq 10^{12}$) - spolu predstavujú interval, na ktorom premáva výťah.\r\n\r\nV druhom riadku je práve jedno číslo $p$, určujúce počet poschodí, ktoré sú mysteriózne.\r\n\r\nV treťom, poslednom riadku, je $p$ medzerou oddelených čísel, reprezentujúce mysteriózne poschodia, cez ktoré nechceme prejsť výťahom, ani tam nastúpiť či vystúpiť.\r\n\r\n\r\n\r\n## Hodnotenie\r\n\r\nPremenná $n$ reprezentuje celkový počet poschodí, teda $n = k-z+1$, cez ktoré premáva výťah.\r\nPremenná $p$ reprezentuje počet mysterióznych poschodí, ktorým sa treba vyvarovať.\r\nPlatí, že ľubovolné tajné poschodie nie je menšie ako $z$ ani väčšie ako $k$. V nasledujúcej tabuľke uvádzame horné obmedzenia pre $n$ a $p$ v 4 sadách vstupov - za každú úspešne vyriešenú sadu vám testovač udelí 2 body.\r\n\r\n| Sada | 1 | 2 | 3 | 4 |\r\n|:----------------|---------:|---------:|----------:|-------:|\r\n| $1 \\leq n \\leq$ | $20$ | $1\\,000$ | $10^6$ | $10^9$ |\r\n| $0 \\leq p \\leq$ | $20$ | $1\\,000$ | $10^6$ | $10^9$ |\r\n(v C++ nezabudnite použiť `long long` premenné)\r\n\r\n\r\n## Formát výstupu\r\nVypíšte jeden riadok a v ňom jedno celé číslo - dĺžka najdlhšieho úseku cesty výťahom bez prechodu cez nejaké mysteriózne poschodie.\r\n\r\n\r\n## Príklady\r\n\r\n```vstup\r\n2 11\r\n2\r\n4 9\r\n```\r\n\r\n```vystup\r\n4\r\n```\r\n*Najdlhšie sa budeme viesť 4 poschodia a to od piateho po ôsme (vrátane).*\r\n\r\n\r\n```vstup\r\n1 4\r\n1\r\n1\r\n```\r\n\r\n```vystup\r\n3\r\n```\r\n*Nastupujeme na druhom a ideme až na štvrté - dokopy tri poschodia.*\r\n\r\n\r\n```vstup\r\n40 533\r\n5\r\n95 71 533 49 233\r\n```\r\n\r\n```vystup\r\n299\r\n```", "type": "PS", "problem": 2}}, {"model": "problems.text", "pk": 5, "fields": {"text": "# Stankova dilema {vzorak=\"Filip Siviček\" mail=\"filip.sivicek@trojsten.sk\" bodypopis=12 bodyprogram=8}\r\n%by Filip Siviček\r\n%proofread fezjo\r\n\r\n## Bruteforce\r\nBruteforce sa väčšinou robí tak, že vyskúšame všetky možnosti. Keďže máme zistiť, koľko dvojíc predmetov je podobnejších ako rozdielnejších, stačí vyskúšať každú dvojicu a spraviť pre ne XOR a AND. Keď bude ich XOR väčší ako ich AND, zapamätáme si to. Všetkých dvojíc je $\\binom{n}{2}$. To znamená, že toto riešenie má časovú zložitosť $O(n^2)$. Pamäťovú zložitosť má $O(n)$, pretože si potrebujeme zapamätať všetky čísla zo vstupu, aby sme ich mohli navzájom porovnať.\r\n\r\n## Zaujímavá myšlienka\r\nDve čísla sú podobnejšie ako rozdielnejšie vtedy, keď ich najľavejší jednotkový bit je na \"rovnakom mieste\" (nasleduje za ním v oboch číslach rovnako veľa bitov). Majme dve čísla v binárnom tvare $1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$ a $1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$, kde $k$ je počet bitov čísla a štvorček značí bit.\r\nIch AND je $1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$ a ich XOR je $0\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$. Očividne platí, $1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0} > 0\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$. To znamená, že sú podobnejšie ako rozdielnejšie. Naopak, ak máme dve čísla - $1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$ a $0\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$, ktoré nemajú najľavejší jednotkový bit na rovnakom mieste, tak ich AND je $0\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$ a ich XOR je $1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$. Očividne platí, že $0\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0} < 1\\square_{k-2}\\square_{k-3}...\\square_{1}\\square_{0}$. To znamená, že sú rozdielnejšie ako podobnejšie.\r\nZ toho vyplýva, že nám stačí o čísle vedieť jeho najľavejší jednotkový bit aby sme vedeli, koľko čísel je s ním podobnejších ako rozdielnejších.\r\n\r\n## Optimálne riešenie\r\nVytvoríme si pole s veľkosťou $b$, kde $b$ je počet bitov najväčšieho čísla. V tomto poli si budeme pamätať, koľko čísel s daným najľavejším bitom sme videli.\r\n\r\nNajľavejší bit čísla vieme v C++ zistiť pomocou funkcie `__builtin_clz()`, ktorá spočíta počet nulových bitov na začiatku čísla (v $O(1)$!). V Pythone zasa môžeme využiť funkciu `bin()`, ktorá prevedie číslo do binárnej sústavy a vráti ho ako string. Pozíciu najľavejšieho jednotkého bitu zisíme ako `len(bin(x)) - 2`.\r\n\r\nKeď už máme vstup prejdený a pole naplnené, zostáva nám spočítať počet dvojíc. Vieme, že ľubovoľné dve čísla s rovnakým najľavejším bitom sú viac podobné ako rozdielne. Na zistenie počtu dvojíc môžeme použiť vzorec $\\frac{n_i*(n_i - 1)}{2}$, kde $n_i$ je číslo na i-tom mieste v našom poli. Alternatívne si vieme počet dvojíc počítať počas plnenia pola. Vždy pred tým, než zvýšime hodnotu pola o jedna k finálnemu výsledku pripočítame túto hodnotu pola. Zamyslite sa, že týmto postupom dostaneme rovnaký výsledok.\r\n \r\nČasová zložitosť riešenia je $O(bn)$ a pamäťová je $O(b)$. Ale keďže $b$ je vo všetkých vstupoch rovnaké a počet bitov sa väčšinou ako premenná vynecháva, môžeme povedať, že časová zložitosť je $O(n)$ a pamäťová je $O(1)$.\r\n\r\n\r\n% Uncomment listings only after doprogramovavanie is finished.\r\n\r\n\\listing{prikl3/vstupy/sol.py}\r\n\r\n\\listing{prikl3/vstupy/sol-bitmagic.cpp}", "type": "ES", "problem": 3}}, {"model": "problems.text", "pk": 6, "fields": {"text": "# Stankova dilema {bodypopis=12 bodyprogram=8}\r\n%by <MisQo>\r\n%proofread <niektoiny>\r\n\r\n% cpp time limit 1s\r\n%python time limit 3s?\r\n\r\nPomaly sa blíži začiatok semestra, a s ním aj najťažšie rozhodnutia každého študenta - ktoré predmety si zapísať? Presne takúto dilemu má aj Stanko, študent informatiky na matfyze^[[tom lepšom](https://fmph.uniba.sk/)]. Stanko si najprv teda zapísal všetky povinné predmety - napríklad programovanie, algebru, angličtinu, či telesnú, a má ešte veľa zaujímavých nepovinných predmetov, ktoré by si chcel zapísať - napríklad Neštruktúrované rozpravy o štruktúrach: kapitoly z matematiky pre informatikov, Hyperprogramovanie, či Determinanty pohybovej aktivity^[na fakulte telesnej výchovy a športu]. Bohužial, už teraz má plný rozvrh, a v škole bude tak 12 hodín denne, takže si nemôže zapísať všetky predmety, ale len 2. Zároveň, aby to nemal až príliš tažké^[a stíhal popri škole pripravovať úlohy do KSP] chcel by, aby boli tieto dva predmety viac rovnaké, ako rozdielne. \r\n\r\n## Úloha\r\nPre každý predmet existuje jedno číslo, ktoré daný predmet dokonale popisuje. Dva predmety sú tak rovnaké, aká je hodnota bitového ANDu ich čísel, a tak rozdielne ako je hodnota ich bitového XORu. Vašou úlohou je zistiť, koľko dvojíc predmetov spĺňa Stankove kritérium - dvojica je viac rovnaká ako rozdielna.\r\n\r\n## Bitové operácie\r\nBitové operácie majú ako \"vstup\" dve čísla, a vracajú jedno. Pozerajú sa na zápis vstupných čísiel v 2-kovej sústave – ich _bitový zápis_. Potom sa pozrú na každú bit (pozíciu) zvlášť, a vo výsledku bude bit podľa tých na vstupe. V prípade XORu (buď alebo) bude výsledok '1' ak boli vstupné bity rôzne a inak '0'. V prípade ANDu (a) to bude '1' len v prípade, že boli oba vstupné bity '1', v opačnom '0'.\r\nNapríklad bitový AND čísel $6$ a $12$, teda $6 \\& 12 = 4$, a ich bitový XOR $6 \\oplus 12 = 10$. Bitová reprezentácia $6$ je '0110' a $12$ je '1100'. Teda ich AND má bitovú reprezentáciu '0100' a XOR '1010'.\r\n\r\n## Formát vstupu\r\n\r\nV prvom riadku vstupu je číslo $n$ - počet predmetov, nad ktorými Stanko uvažuje.\r\nV druhom riadku je medzerou oddelených $n$ čísel $p_1, \\dots p_n$, $p_i$ popisuje $i$-ty predmet.\r\nPlatia nasledujúce obmedzenia:\r\n$1 \\leq p_i \\leq 10^{9}$\r\n\r\n| Sada | 1 | 2 | 3 | 4 |\r\n|:----------------------:|:--------:|:------:|:--------:|:------------:|\r\n| $1 \\leq n \\leq$ | $6$ | $30$ | $1\\,000$ | $2\\cdot10^5$ |\r\n\r\n## Formát výstupu\r\n\r\nVypíš jeden riadok a v ňom jedno celé číslo - počet dvojíc predmetov, ktoré sú viac podobné ako rozdielne.\r\n\r\n## Príklad\r\n\r\n```vstup\r\n5\r\n1 4 3 7 10\r\n```\r\n\r\n```vystup\r\n1\r\n```\r\n\r\n*Vyhovuje iba dvojica $4$ a $7$.*\r\n\r\n```vstup\r\n3\r\n3 3 3\r\n```\r\n\r\n```vystup\r\n3\r\n```\r\n\r\n```vstup\r\n2\r\n2 4\r\n```\r\n\r\n```vystup\r\n0\r\n```", "type": "PS", "problem": 3}}, {"model": "problems.text", "pk": 7, "fields": {"text": "# Školské pomôcky {vzorak=\"Marianka\" mail=\"marianna.hronska@trojsten.sk\" bodypopis=12 bodyprogram=8}\r\n%by Marianka\r\n%proofread fezjo\r\n\r\n## Bruteforce\r\n\r\nNajjednoduchšie riešenie tejto úlohy je vyskúšať každú kombináciu pomôcok, ktorú Peťko vie v obchode nájsť. Pre prvú sadu je to jednoduché, pretože vyskúšame každú dvojicu pomôcok typu $1$ a $2$, a vyberieme dvojicu, ktorá sa zmestí do rozpočtu a má najvyššiu kvalitu. Pre druhú sadu je takéto riešenie pomalé a stačiť nebude.\r\n\r\nPre tretiu sadu vieme použiť rovnaký princíp -- vyškúšať každú kombináciu pomôcok. Bude to však ťažšie ako pri prvej sade, lebo máme rôzny počet typov. Takéto niečo vieme pomerne v pohode vyriešiť rekurzívnym DFS prehľadávaním všetkých možností. Pre štvrtú sadu je takéto riešenie pomalé.\r\n\r\n## Rýchlejšie riešenie pre dva typy\r\n\r\nPozrime sa na trochu lepšie riešenie, ktoré prejde cez druhú sadu. Naše riešenie bude počítať s tým, že sú iba dva typy pomôcok. Pomôcky si rozdelíme do dvoch polí podľa ich typov a tieto polia zoradíme podľa kvality. Náš program pôjde zozadu oboch polí a bude sa snažiť kupovať najkvalitnejšie pomôcky. Vezmeme najkvalitnejšiu pomôcku z jedného typu a dáme ju do páru s najlacnejšou pomôckou druhého typu, ktorá má aspoň takú kvalitu ako tá najkvalitnejšia z prvého typu.\r\n\r\nNajlacnejšiu pomôcku s aspoň takou kvalitou vieme nájsť jednoducho. Pôjdeme zozadu poľa druhého typu cez všetky pomôcky, ktoré sú väčšie alebo rovné kvalite prvej pomôcky a zistíme, ktorá je najlacnejšia. Keď sa v poli prvého typu posunieme o jednu pomôcku doľava, nemusíme v druhom poli začínať znova od konca. Stačí pokračovať od miesta kde sme naposledy prestali (premyslite si prečo). Tento prístup sa nazýva dvaja bežci. Alternatívne, keďže sme si polia utriedili, môžeme, bez zhoršenia časovej zložitosti, pomôcky v druhom poli binárne vyhľadávať.\r\n\r\nAk je cena tejto dvojice pomôcok vyššia ako je rozpočet, tak musíme hľadať ďalej. Takéto riešenie má časovú zložitosť $O(n \\log(n) + n)$. Avšak, toto riešenie prejde iba cez prvé dve sady. My potrebujeme riešenie, ktoré počíta s tým, že počet typov pomôcok je variabilný.\r\n\r\nAk nevieme prísť na vzorové riešenie, ale chceme maximaizovať náš počet bodov. Vieme skombinovať toto riešenie a bruteforce pre $t > 2$ a získať body za prvé tri sady. Samozrejme treba dávať pozor, ktoré riešenie používame pri akej sade.\r\n\r\n## Vzorové riešenie\r\n\r\nÚlohu vyriešime pomocou binárneho vyhľadávania, ktoré nám pomôže nájsť najvyššiu kvalitu pomôcok za cenu, ktorú si vie Peťko dovoliť. Binárne vyhľadáme kvalitu $k$, ktorá spĺňa naše požiadavky. Ak chceme dosiahnúť aspoň kvalitu $k$, tak sa pre každý typ pomôcky pokúsime nájsť najlacnejšiu pomôcku, ktorá má aspoň kvalitu $k$. Ak je súčet týchto najlacnejších pomôcok väčší ako počet peňazí, tak musíme hľadať ďalej a skúsime menšie $k$. Ak je súčet pomôcok menší alebo rovný ako počet peňazí, tak sme našli jedno možné riešenie, ale stále chceme pokračovať ďalej a vyskúšať väčšie $k$. Pokračujeme až kým sa nám neminú možnosti. V takom prípade sme buď našli najvyššiu kvalitu pomôcok, ktorú si vie Peťko dovoliť, alebo sme zistili, že také pomôcky neexistujú. Riešenie má časovú zložitosť $O(n \\log(n) + n)$.\r\n\r\nExistuje ešte ďalšie riešenie, ktoré je zovšeobecnením rýchleho riešenia pre dva typy. Pomôcky si zoradíme podľa kvality. Použijeme úplne ten istý prístup ako pri dvoch typoch -- pozerieme sa na pomôcku z nejakého typu a snažíme sa nájsť súčet najlacnejších pomôcok všetkých zvyšných typov, ktoré majú aspoň takú kvalitu. Avšak, toto hľadanie musíme robiť v $O(1)$. Ak spravíme niečo ako techniku $t$ bežcov, tak si nám stačí tento súčet aktualizovať pri posune bežca. Takéto riešenie má časovú zložitosť $O(n \\log(n))$. Ak to chceme ešte úplne vyhrotiť, tak na zoradenie polí môžeme použiť bucketsort a tak bude mať naše riešenie časovú zložitosť $O(n)$. Detaily si môžete pozrieť v kóde.\r\n\r\n\r\n% Uncomment listings only after doprogramovavanie is finished.\r\n\r\n\\listing{prikl4/vstupy/sol-marianka.py}\r\n\r\n\\listing{prikl4/vstupy/sol-fezjo-100-bucketsort.py}", "type": "ES", "problem": 4}}, {"model": "problems.text", "pk": 8, "fields": {"text": "# Školské pomôcky {bodypopis=12 bodyprogram=8}\r\n%by Marianka\r\n%proofread <niektoiny>\r\n\r\nŠkola sa zas nezastaviteľne blíži a Peťko si musí ísť kúpiť nové pomôcky. Po\r\ndlhom prieskume obchodov sa rozhodol ísť do KSP^[Kvalitné School Pomôcky - názov\r\nbol inšpirovaný Banskobystrickou legendou Vlak Bus Shopping], kde majú\r\nnajkvalitnejšie školské pomôcky. Možno sa pýtate, prečo Peťkovi tak veľmi\r\nzáležalo na ich kvalite? On sa totiž toto leto dočítal v časopise, že čím lepšiu\r\nsúpravu pomôcok bude mať, tým viac sa mu bude dariť v škole. A to sa oplatí.\r\n\r\nNie je to však také jednoduché, pretože celková kvalita súpravy školských\r\npomôcok je taká kvalitná, ako jej najmenej kvalitná pomôcka. Taktiež, Peťko nemá\r\nneobmedzene veľa peňazí a celková cena sa musí zmestiť do vreckového od jeho\r\nrodičov. Celý tento proces je náročnejší ako si Peťko myslel a teraz má hlavu v\r\nsmútku, pretože sa mu nechce rozmýšlať^[Chudák Peťko má ešte stále prázdniny.],\r\nktoré pomôcky si má vybrať. Pomôžte mu s jeho dilemou, aby sa mu tento rok čo\r\nnajviac darilo.\r\n\r\n## Úloha\r\n\r\nV obchode majú rôzne typy školských pomôcok -- pero, ceruzka, zošit... označené\r\nčíslami od $1$ po $t$. Každá pomôcka má tri atribúty -- typ, cena, kvalita.\r\nPeťko chce nakúpiť pomôcky tak,\r\n\r\n1. aby mal z každého typu jednu;\r\n2. aby cena jeho nákupu nepresiahla peniaze, ktoré má k dispozícií;\r\n3. a aby celková kvalita súpravy pomôcok bola čo najväčšia.\r\n\r\nPeťko má na výber z $n$ pomôcok a má k dispozícií $m$ peňazí. Celková kvalita\r\nnákupu sa rovná kvalite najmenej kvalitnej pomôcky. Zistite celkovú kvalitu\r\nPeťkovho nákupu.\r\n\r\n## Formát vstupu\r\n\r\nNa prvom riadku dostanete tri čísla $t$ (počet typov školských pomôcok), $n$\r\n(počet pomôcok na výber) a $m$ (vreckové od rodičov). Na ďalších $n$ riadkoch\r\ndostanete tri čísla -- $t$ udávajúce typ pomôcky, $c$ ($0 \\leq c \\leq 2 \\cdot m$) udávajúce\r\ncenu pomôcky a $k$ ($1 \\leq k \\leq 5 \\cdot n$) udávajúce kvalitu pomôcky.\r\n\r\nV jednotlivých sadách platia nasledujúce obmedzenia:\r\n\r\n| Sada | 1 | 2 | 3 | 4 |\r\n|:----------------|------:|-----------:|-----------:|-----------:|\r\n| $2 \\leq t \\leq$ | $2$ | $2$ | $1\\,000$ | $500\\,000$ |\r\n| $6 \\leq n \\leq$ | $100$ | $500\\,000$ | $1\\,000$ | $500\\,000$ |\r\n| $1 \\leq m \\leq$ | $200$ | $20\\,000$ | $250\\,000$ | $10^9$ |\r\n\r\n## Formát výstupu\r\n\r\nVypíšte jeden riadok a v ňom jedno celé číslo udávajúce celkovú kvalitu súpravy\r\nkúpených pomôcok. Ak sa pomôcky nedajú kúpiť, vypíšte $0$.\r\n\r\n## Príklady\r\n\r\n```vstup\r\n2 6 20\r\n1 16 24\r\n1 8 11\r\n2 12 18\r\n1 6 7\r\n2 13 15\r\n2 25 15\r\n```\r\n\r\n```vystup\r\n11\r\n```\r\n\r\n*Peťko chce maximalizovať kvalitu jeho pomôcok, lenže najkvalitnejšie stoja\r\n$16 + 12 = 28$, čo je viac ako $20$. Preto si nekúpi najkvalitnejšiu pomôcku typu\r\n$1$, ale druhú najkvalitnejšiu. Jeho nákup bude stáť $8 + 12 = 20$. Celková\r\nkvalita súpravy pomôcok je $11$, pretože pomôcka s najmenšou kvalitou má kvalitu\r\n$11$.*\r\n\r\n```vstup\r\n2 6 12\r\n2 8 17\r\n1 6 10\r\n1 9 4\r\n2 12 5\r\n2 11 23\r\n1 12 5\r\n```\r\n\r\n```vystup\r\n0\r\n```\r\n\r\n*Ak si chce Peťko kúpiť z každého typu predmetu jeden, tak mu na to nevýjdu\r\npeniaze.*", "type": "PS", "problem": 4}}, {"model": "problems.text", "pk": 9, "fields": {"text": "# Koho ešte nepoznám? {vzorak=\"Merlin\" mail=\"martin.bellus@trojsten.sk\" bodypopis=12 bodyprogram=8}\r\n%by Merlin\r\n%proofread fezjo\r\n\r\n## Bruteforce\r\nV prvej sade sú limity celkom malé, teda si môžeme dovoliť vygenerovať všetky možné výsledné plány Matfyzu a následne zistiť, či aspoň jeden z nich vyhovuje zadaniu.\r\nNa takéto generovanie môžeme použiť napríklad techniku bitmasiek, kde si vygenerujeme postupne všetky $n \\cdot m$ bitové čísla a podľa nich vygenerujeme zábrany.\r\nAk je nejaký bit 1, tak na dané miesto v pláne Matfyzu dáme zábranu (ak sa to teda dá), inak ju tam nedáme.\r\nPotom nám už len zostáva skontrolovať podmienky zo zadania.\r\n\r\nPre každého Matfyzáka z jeho pozície môžeme spustiť prehľadávanie [do širky](https://www.ksp.sk/kucharka/bfs/) (alebo aj [do hĺbky](https://www.ksp.sk/kucharka/dfs/)). Ak sa týmto prehľadávaním dostaneme do pravého dolného rohu Matfyzu, tak sa vedia dostať von.\r\nPodobne to spravíme aj pre každého FIITáka.\r\nAk sa každý Matfyzák a žiaden FIITák dokáže dostať von, tak sme našli správne riešenie, inak je aktuálne riešenie nesprávne.\r\nPre každého človeka potrebujeme spustiť prehľadávanie, ktoré má časovú zložitosť $O(n \\cdot m)$. Ľudí ale môže byť až $n \\cdot m$, teda časová zložitosť kontroly jedného plánu je $O(n^2 \\cdot m^2)$.\r\nKeďže všetkých podmnožín $n \\cdot m$ prvkovej množiny je $2^{n \\cdot m}$, tak celková časová zložitosť je $O(n^2 \\cdot m^2 \\cdot 2^{n \\cdot m})$.\r\n\r\n% TODO subor neexistuje\r\n\\listing{prikl5/vstupy/sol_vzorak_bruteforce.cpp}\r\n\r\n## Ako lepšie zablokovať FIITákov?\r\nAko prvé si môžeme všimnúť, že ak má byť plán úspešný, tak vo výslednom pláne Matfyzu nemôže existovať nezablokovaná cesta medzi FIITákom a Matfyzákom.\r\nAk by taká existovala, tak FIITák príde za Matfyzákom a od teraz ho bude len nasledovať. Potom sa buď nevie dostať Matfyzák von z budovy alebo sa FIITák dokáže dostať z budovy. Teda aspoň jedna z podmienok zo zadania nebude splnená.\r\nTeda ak sa na začiatku vedľa seba nachádza nejaký FIITák a Matfyzák, tak riešenie určite neexistuje.\r\n\r\nSkúsme sa teraz zamyslieť nad tým, ako zabrániť FIITákom dostať sa von z budovy.\r\nPovedzme, že to spravíme najjednoduchším spôsobom, akým to ide a všetky 4 políčka okolo každého FIITáka zablokujeme (ak sa tam už niečo nenachádza).\r\nTakto od seba oddelíme FIITákov od Matfyzákov (ak nejakí nezačínali vedľa seba) a zablokujeme im východ zo školy.\r\n\r\nNájsť takýmto spôsobom zátarasy má časovú zložitosť $O(n \\cdot m)$, lebo stačí raz prejsť celú tabuľku.\r\n\r\nKontrolovať riešenie môžeme rovnakým spôsobom, ako v bruteforce riešení.\r\nVýsledná časová zložitosť potom bude $O(n^2 \\cdot m^2)$, čo stačí na prejdenie prvých 2 až 3 sád.\r\n\r\n\\listing{prikl5/vstupy/sol_vzorak_partial.cpp}\r\n\r\n## Prečo toto funguje?\r\nPredstavme si, že sme takto obkolesili každého FIITáka, teda sa žiaden z nich nedokáže dostať von.\r\nTeda ak nie je naše riešenie správne, tak sme museli zablokovať aspoň jedného z Matfyzákov (takého, ktorý sa predtým vedel dostať von).\r\nAk by sme chceli tohto Matfyzáka odblokovať, tak musíme aspoň jednu zo zábran, ku ktorej sa tento Matfyzák vie dostať odstrániť, aby mohol prejsť ďalej.\r\nPotom ale určite existuje nezablokovaná cesta medzi FIITákom a Matfyzákom, lebo nami pridané zábrany susedia priamo z FIITákmi.\r\nTeda riešenie by aj tak neexistovalo.\r\n\r\n\r\n## Optimálne riešenie\r\nZisťovanie, či je dané riešenie správne, je zatiaľ príliš pomalé. Ako by sa teda dalo zrýchliť?\r\nAsi by bolo treba spúšťať len jedno prehľadávanie. Spravíme to teda opačne a prehľadávanie spustíme z pravého dolného rohu Matfyzu.\r\nPočas tohto prehľadávania budeme počítať, na koľko Matfyzákov sme zatiaľ narazili. Keďže sa dá dostať z východu k danému Matfyzákovi, tak sa dá aj od toho Matfyzáka dostať k východu.\r\nTeda stačí len porovnať celkový počet Matfyzákov na začiatku s počtom Matfyzákov, ktorých sme prešli pri prehľadávaní.\r\nKeďže spúšťame už len jedno prehľadávanie, tak toto riešenie už bude mať časovú zložitosť $O(n \\cdot m)$ a pamäťovú zložitosť $O(n \\cdot m)$, teda by malo dostať 8 bodov.\r\n\r\n\\listing{prikl5/vstupy/sol_vzorak.cpp}\r\n\r\n\\listing{prikl5/vstupy/sol_vzorak.py}\r\n\r\n## Iné zaujímavé riešenie\r\nMôžeme si všimnúť, že to, ako má vyzerať nejaký riadok vo výsledku je jednoznačne určené tým, ako vyzerá riadok nad ním a riadok pod ním. Teda zistiť, kde chceme pridať v aktuálnom riadku zábrany je pomerne jednoduché.\r\nZaujímavejší problém je ale zistiť, či je toto vyplnenie správne alebo nie, ak máme k dispozícií len $3$ po sebe idúce riadky.\r\nRozdeľme si políčka do komponentov tak, že z každého políčka v komponente sa dá dostať do každého iného v tom komponente. Potom si pre každý riadok stačí pamätať, ktoré políčko patrí do ktorého komponentu a koľko Matfyzákov sa nachádzaz v ktorom komponente. Aby bolo riešenie správne, tak komponent obsahujúci východ z Matfyzu musí obsahovať všetkých Matfyzákov.\r\nOstáva nám už len dopočítať z toho, ako vyzerajú komponenty v predošlom riadku to, ako majú vyzerať v aktuálnom.\r\nKomponenty si budeme pamätať v dátovej štruktúre UnionFind, v ktorej vieme v čase $O(\\alpha(n))$ zistiť, v ktorom komponente je prvok alebo spojiť 2 komponenty. (kde $\\alpha(n)$ je [inverzná Ackermannova funkcia](https://cs.wikipedia.org/wiki/Ackermannova_funkce#Inverzn%C3%AD_funkce), ktorá je pre ľubovoľné rozumne predstaviteľné čísla menšia ako $5$)\r\nAk sa na políčku $i$ v aktuálnom riadku nenachádza stena, tak bude v rovnakom komponente, ako políčko $i$ v predošlom riadku. Potom nám už len stačí spojiť komponenty susedných políčok v aktuálnom riadku a pridať Matfyzákov ku komponentom, do ktorých patria.\r\n\r\nÚlohu teda vyriešime v dvoch prechodoch. V prvom zistíme pomocou vyššie uvedeného algoritmu, či riešenie existuje a ak hej, tak ho v druhom prechode nájdeme a vypíšeme.\r\nToto riešenie má síce zanedbateľne horšiu časovú zložitosť $O(\\alpha(m) \\cdot n \\cdot m)$, ale okrem vstupu si musí pamätať len $O(m)$ pamäte navyše. A hlavne, ak by ako výstup stačilo iba určiť úspešnosť plánu (keďže výsledný plán je triviálne skonštruovať), postačoval by nám jeden prechod a pamäťová zložitosť by bola iba $O(m)$.\r\n\r\n\\listing{prikl5/vstupy/sol-fezjo-100-memory.cpp}", "type": "ES", "problem": 5}}, {"model": "problems.text", "pk": 10, "fields": {"text": "# Koho ešte nepoznám? {bodypopis=12 bodyprogram=8}\r\n%by Merlin\r\n%proofread <niektoiny>\r\n%cpp staci 1s tam je dost rezerva, python by som dal 2s\r\n\r\nPrvácky týždeň na Matfyze je v plnom prúde. Budúci študenti (medzi ktorými je mimochodom aj Duško) si užili mnoho prednášok, spoznávacích hier a iných blbostí, ktoré Dušan už dávno poznal (veď Matfyz je už dávno jeho druhým domovom a do T2 už chodí aj spávať).\r\nTakto znudený sa teda rozhodol, že na budúcich študenton FIIT-ky nastraží habaďúru. Počas spoločnej zoznamovačky sa nenápadne vytratil a začal snovať plán, ako uväzniť FIITákov na Matfyze.\r\nA čo je ešte lepšie, o chvíľu bude obed a ak cesty zatarasí dostatočne dobre, tak FIITáci nestihnú prísť do Eat&Meetu [^1] načas.\r\nTreba si len dať pozor na to, aby nevymkol aj nejakého zo svojich kamarátov.\r\n\r\n[^1]:A toto masívne [menu](http://eatandmeet.sk/tyzdenne-menu) predsa nikto nechce zmeškať.\r\n\r\n\r\n## Úloha\r\n\r\nPôdorys Matfyzu si vieme predstaviť ako štvorčekovú mriežku s $n$ riadkami a $m$ stĺpcami.\r\nKaždé políčko môže byť zablokované `#`, prázdne `.` alebo na ňom môže stáť človek ( `F` ak to je FIITák alebo `M` ak je Matfyzák).\r\nV pravom dolnom rohu mapky sa nachádza východ, cez ktorý sa dá dostať do Eat&Meetu.\r\nDušan chce na FIITákov nastražiť nasledovnú habaďúru.\r\nZablokuje nejaké prázdne políčka Matfyzu tak, aby sa žiaden FIITák nevedel dostať von z Matfyzu, ale každý Matfyzák sa z neho vedel dostať.\r\nKaždý človek vie chodiť len po hranou susediacich políčkach.\r\nPomôžte Dušanovi zistiť, ktoré políčka má zablokovať alebo povedzte, že sa to proste nedá.\r\n\r\n## Formát vstupu\r\n\r\nV prvom riadku vstupu sú čísla $n$ a $m$ ($1 \\leq n, m \\leq 600$) udávajúce rozmery Matfyzu.\r\nNasleduje $n$ riadkov a na každom z nich $m$ znakov `.`, `#`, `M` alebo `F` popisujúce aktuálny stav Matfyzu a rozmiestnenie ľudí.\r\nJe garantované, že pravé dolné políčko (teda východ) je vždy prázdne.\r\n\r\nV jednotlivých sadách platia nasledujúce obmedzenia:\r\n\r\n| Sada | 1 | 2 | 3 | 4 |\r\n|:-----------------------|---------:|-------:|---------:|---------:|\r\n| $1 \\leq n,m \\leq$ | $4$ | $25$ | $100$ | $600$ |\r\n\r\n## Formát výstupu\r\n\r\nVypíšte `Plan uspesny`, ak sa dajú zablokovať niektoré políčka tak, aby sa všetci Matfyzáci vedeli dostať z Matfyzu von a všetci FIITáci nie.\r\nPotom vypíšte $n$ riadkov a na každom z nich $m$ znakov reprezentujúcich to, ako môže vyzerať Matfyz po pridaní prekážok, aby Dušanova habaďúra vyšla.\r\nAk existuje viac možností, vypíšte ľubovoľnú z nich.\r\nAk sa to nedá, vypíšte len na jeden riadok `Neda sa`.\r\n\r\nNezabudnite posledný riadok ukončiť znakom konca riadku.\r\n\r\n## Príklady\r\n\r\n```vstup\r\n3 3\r\nM..\r\n..F\r\nM..\r\n```\r\n\r\n```vystup\r\nNeda sa\r\n```\r\n\r\n*Jediný spôsob, ako zabrániť FIITákovi sa dostať z univerzity von je, ak zablokujeme východ. Potom sa ale z univerzity nebudú vedieť dostať ostatní Matfyzáci.*\r\n\r\n```vstup\r\n5 5\r\n...F.\r\nF....\r\n..###\r\n##M..\r\nM....\r\n```\r\n\r\n```vystup\r\nPlan uspesny\r\n...F.\r\nF....\r\n..###\r\n##M..\r\nM....\r\n```\r\n\r\n*Netreba pridávať žiadne prekážky, žiaden FIITák sa nedokáže dostať z univerzity.*\r\n\r\n```vstup\r\n2 5\r\nF.MMM\r\n.F.M.\r\n```\r\n\r\n```vystup\r\nPlan uspesny\r\nF#MMM\r\n.F#M.\r\n```", "type": "PS", "problem": 5}}, {"model": "problems.text", "pk": 11, "fields": {"text": "# Oči veľké {bodypopis=12 bodyprogram=8}\r\n%by <JKonc>\r\n%proofread <niektoiny>\r\n\r\nKubo si, ako každý iný premotivovaný prváčik na Matfyze, zapísal o trošku viac predmetov, než je bežné. *Odporúčané predmety? No šak obvi. \\*klik\\* Angličtina? Veď som z nej maturoval, kredity zadarmo! \\*klik\\* Diferenciálne rovnice? Tie slová som už na gympli počul, to bude easy. \\*klik\\* Marek písal, že ide na politológiu? \\*klik\\* Čo je toto? História piva?!? To znie zaujímavo...*\r\n\r\nNo ale teraz sa začal školský rok, z Kuba opadla všetká eufória a uvedomil si, že si zapísal tak približne tisíc predmetov a neexistuje ani najmenšia šanca, že by všetkými prešiel. A tak po chvíli veľmi pokojného rozmýšľania prišiel s (ako zvyčajne) geniálnym plánom. Zistí si informácie o každom predmete a vyrobí si detailný študijný plán, ktorý mu maximalizuje počet získaných kreditov!\r\n\r\nAle len o pár minút neskôr si o sebe uvedomil ďalšiu, ešte nepríjemnejšiu, realitu. Pred nástupom si hovoril, ako tvrdo bude pracovať, ako porazí prokrastináciu a stane sa z neho Ačkový žiak. Avšak teraz tu leží na posteli, plánu sa, samozrejme, ani nedotkol, a číta si o tom, ako sa kraby päťkrát nezávisle vyvinuli [^1]. Ako sa sem dostal? Ani sám nevie. Ale jedno je jasné. Jeho práca opäť padne na vás...\r\n\r\n[^1]:<https://en.wikipedia.org/wiki/Carcinisation> - dosť dobrý rabbit hole, odporúčam.\r\n\r\n## Úloha\r\n\r\nKubo má zapísaných $n$ predmetov. Každému predmetu prislúcha istý počet kreditov $k_i$, ktoré Kubo získa za úspešné absolvovanie skúšky z tohto predmetu. Pre každý predmet vieme, že Kubo má ešte $d_i$ dní do termínu skúšky a že potrebuje $t_i$ z nich stráviť štúdiom daného predmetu, aby skúšku urobil.\r\n\r\nZistite, aké je najväčšie možné množstvo kreditov, ktoré vie Kubo získať.\r\n\r\n## Formát vstupu\r\n\r\nV prvom riadku vstupu je číslo $n$ ($1 \\leq n \\leq 1\\,000$) udávajúce počet predmetov, ktoré má Kubo zapísané.\r\n\r\nKaždý z nasledujúcich $n$ riadkov obsahuje tri čísla - $k_i$, $d_i$ a $t_i$ ($1 \\leq k_i \\leq 10^6, 1 \\leq t_i \\leq d_i \\leq 20\\,000$) popisujúce jeden predmet.\r\n\r\nÚloha má niekoľko sád vstupov, ktoré navyše spĺňajú nasledujúce obmedzenia:\r\n\r\n| Sada | 1 | 2 | 3 | 4 |\r\n| :-------------- | -------: | --------: | -------: | --------: |\r\n| $n \\leq$ | $20$ | $100$ | $1\\,000$ | $1\\,000$ |\r\n| $\\max d_i \\leq$ | $2\\,000$ | $20\\,000$ | $2\\,000$ | $20\\,000$ |\r\n\r\n## Formát výstupu\r\n\r\nVypíš jeden riadok a v ňom jedno celé číslo - maximálny počet kreditov, ktorý dokáže Kubo získať.\r\n\r\n\r\n## Príklad\r\n```vstup\r\n3\r\n5 7 5\r\n2 8 4\r\n4 5 4\r\n```\r\n\r\n```vystup\r\n6\r\n```\r\n\r\n_Prvé 4 dni strávime štúdiom tretieho predmetu a nasledujúce 4 dni štúdiom druhého. Takto spravíme skúšku z oboch z nich a tak získame 6 kreditov. Prvý predmet by nám síce dal najviac kreditov, ale okrem neho by sme nič iné nestihli a tak sa nám to neoplatí._", "type": "PS", "problem": 6}}, {"model": "problems.text", "pk": 12, "fields": {"text": "# Oči veľké {vzorak=\"Jakub Konc\" mail=\"jakub.konc@trojsten.sk\" bodypopis=12 bodyprogram=8}\r\n%by Jakub Konc\r\n%proofread fezjo\r\n\r\n## Bruteforce\r\n\r\nNajjednoduchší bruteforce je jednoducho vyskúšať všetky možné priradenia študovaných predmetov ku dňom a skontrolovať, ktoré predmety by sme urobili. Toto je však samozrejme príliš pomalé. Časová zložitosť je $O(n D^n)$, kde $D=\\max d_i$. \r\n\r\nAko toto vieme zrýchliť?\r\n\r\n## Lepší bruteforce\r\n\r\nMôžeme si všimnúť, že keď už raz začneme študovať nejaký predmet, oplatí sa nám ho celý doštudovať a až potom začínať s ďalším. \r\n\r\nPredstavme si totiž, že by v optimálnom riešení existovala dvojica predmetov $A$ a $B$, také, že $A$ sme dokončili skôr ako $B$, ale ešte pred jeho dokončením sme začali študovať $B$. Tu vidíme, že keby sme najprv dokončili $A$, stále by sme mali platné riešenie - $A$ by sme doštudovali skôr a koniec $B$ by sa nezmenil. Tu teda vidíme, že existuje optimálne riešenie, v ktorom každý predmet študujeme v jednom kuse.\r\n\r\nToto znamená, že predmety môžeme vnímať ako súvislé bloky. Zaujíma nás teda len to, ktoré predmety sa rozhodneme študovať a v akom poradí.\r\n\r\nZ tohoto sa nám formuje rýchlejšie riešenie. Vygenerujeme si všetky podmnožiny predmetov a pre každú z nich všetky jej permutácie. Pre každú z nich si skontrolujeme, že zo všetkých predmetoch v nej urobíme skúšku. Zo všetkých, pre ktoré je odpoveď áno zoberieme tú s najviac kreditmi a tá je riešením. Podľa toho, ako šikovne toto implementujeme sa bude časová zložitosť pohybovať medzi $O(n!)$ a $O(n^2 n!)$, čo stále nepostačuje na získanie bodov.\r\n\r\n## Ďaľšie pozorovanie\r\n\r\nTu ale prichádza na radu druhé kritické pozorovanie. Dokážme si, že v optimálnom riešení budeme predmety študovať v poradí ich skúšok. Keby sme mali predmety $A$ a $B$ kde $A$ má termín skôr ako $B$ ale $B$ sa učíme skôr ako $A$, môžeme ich poradie vymeniť. $A$ tak dokončíme skôr a $B$ vtedy, čo pôvodne $A$. To je ale v poriadku, keďže vieme, že $A$ má termín skôr ako $B$.\r\nV nasledujúcich riešeniach si teda predmety na začiatku zoradíme a tým pádom nám vypadáva nutnosť riešiť v akom poradí ich budeme študovať.\r\n\r\nA tu sa nám pomerne priamočiaro rodí ďalšie riešenie. Prejdeme si všetkými podmnožinami predmetov a pre každú skontrolujeme, či dokážeme všetky jej predmety urobiť. Takéto riešenie má časovú zložitosť okolo $O(n 2^n)$ a po jeho odovzdaní sme odmenení dvoma bodmi.\r\n\r\n## Dynamika\r\n\r\nA v tomto bode už skúseného KSP-čkara neprekvapí, že optimálnym riešením bude dynamické programovanie.\r\n\r\nZamyslime sa teda, čo by sme chceli mať ako stav tejto dynamiky. Keďže ideme robiť dynamiku, budeme mať nejaké malé podproblémy a budeme ich rozširovať na väčšie. Teda, aby sme vedeli, či vieme do riešenia pridať nejaký predmet budeme potrebovať skontrolovať či by sme ho vôbec stíhali, a teda v stave určite budeme potrebovať mať počet dní zatiaľ strávených štúdiom $j$. Tiež sa však potrebujeme uistiť, že predmet do jedného riešenia nepridáme dvakrát, tak si pamätajme aj posledný študovaný predmet $i$. Ak $i=0$, znamená to, že sme žiadny predmet ešte nevybrali. \r\n\r\nPre $i=0$ je riešenie jasné - žiadne kredity získať nevieme. Ako teraz spočítame hodnoty stavov s nejakým $i \\geq 1$ ak vieme riešenia pre všetky stavy s menším $i$? Najprv si skontrolujeme, či by sme takto vôbec predmet doštudovali pred skúškou, teda či $j \\leq d_i$. Ak nie, hodnota stavu je samozrejme 0. Inak si prejdeme všetkými možnými predošlými predmetmi a zoberieme najlepšiu možnosť - $\\text{dp}[i][j] = \\max_{0 \\leq x \\leq i-1} \\text{dp}[x][j-t_i] + k_i$. Toto nám dáva časovú zložitosť $O(n^2 D)$, čo je dostatočne rýchle na získanie šiestich bodov.\r\n\r\n## Optimálne riešenie\r\n\r\nOptimalizácia, ktorá nám získa posledné dva body je pomerne jednoduchá a podobá sa klasickému 0-1 knapsacku. Prestaňme vynucovať, že $i$ je posledný predmet -- nech len hovorí, že žiadny predmet po ňom sme už nepoužili. Toto ale znamená, že pri prechode nebudeme musieť prechádzať všetky $x$ menšie ako $i$, ale len $x=i-1$, pretože všetky ostatné v ňom budú zahrnuté. Nový prechod tak bude jednoducho $\\text{dp}[i][j] = \\max(\\text{dp}[i-1][j], \\text{dp}[i-1][j-t_i] + k_i)$ ak $j\\leq d_i$, inak proste dp$[i-1][j]$ . Toto nám dáva časovú aj pamäťovú zložitosť $O(n \\log n + n D)$. Môžeme si však všimnúť, že pri počítaní stavov s $i$ potrebujeme len stav $i-1$, čo znamená, že ostatné vieme postupne zahadzovať a tak mať pamäťovú zložitosť $O(n+D)$.\r\n\r\n\r\n% Uncomment listings only after doprogramovavanie is finished.\r\n\r\n\\listing{prikl6/vstupy/sol-pekne.cpp}", "type": "ES", "problem": 6}}, {"model": "contests.contest", "pk": 3, "fields": {"name": "Korešpondenčný matematický seminár", "short_name": "kms", "site": 1, "order": 0}}, {"model": "contests.category", "pk": 2, "fields": {"name": "Level 2", "identifier": "2", "contest": 3}}, {"model": "contests.category", "pk": 3, "fields": {"name": "Level 1", "identifier": "1", "contest": 3}}]