Submission #43615

# Submission time Handle Problem Language Result Execution time Memory
43615 2018-03-18T08:19:06 Z szawinis Teams (IOI15_teams) C++14
100 / 100
2309 ms 357936 KB
#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e5+10;

int n, used_root, root[N];
vector<int> ls[N], t, nxtl, nxtr;
int newLeaf(int v) {
	t.push_back(v);
	nxtl.push_back(-1);
	nxtr.push_back(-1);
	return t.size()-1;
}
int newPar(int l, int r) {
	t.push_back(t[l] + t[r]);
	nxtl.push_back(l);
	nxtr.push_back(r);
	return t.size()-1;
}
int build(int l = 0, int r = N-1) {
	if(l == r) return newLeaf(0);
	int mid = l+r >> 1;
	return newPar(build(l, mid), build(mid+1, r));
}
int update(int i, int targ, int l = 0, int r = N-1) {
	if(l == r) return newLeaf(t[i] + 1);
	int mid = l+r >> 1;
	if(targ <= mid) return newPar(update(nxtl[i], targ, l, mid), nxtr[i]);
	else return newPar(nxtl[i], update(nxtr[i], targ, mid+1, r));
}
int erase(int i, int zeroi, int targ, int l = 0, int r = N-1) {
	if(r <= targ) return zeroi;
	if(l > targ) return i;
	int mid = l+r >> 1;
	return newPar(erase(nxtl[i], nxtl[zeroi], targ, l, mid), erase(nxtr[i], nxtr[zeroi], targ, mid+1, r));
}
int query(int avail, int used, int k, int l = 0, int r = N-1) {// returns index of new used root, but -1 if failure
	if(t[avail] - t[used] < k) return -1;
	if(l == r) return newLeaf(t[used] + k);
	int cntl = t[nxtl[avail]] - t[nxtl[used]];
	int mid = l+r >> 1;
	if(cntl >= k)
		return newPar(query(nxtl[avail], nxtl[used], k, l, mid), nxtr[used]);
	else
		return newPar(nxtl[avail], query(nxtr[avail], nxtr[used], k - cntl, mid+1, r));
}
int get(int i, int tl, int tr, int l = 0, int r = N-1) {
	if(r < tl || l > tr) return 0;
	if(l >= tl && r <= tr) return t[i];
	int mid = l+r >> 1, ret = 0;
	if(nxtl[i] != -1) ret += get(nxtl[i], tl, tr, l, mid);
	if(nxtr[i] != -1) ret += get(nxtr[i], tl, tr, mid+1, r);
	return ret;
}
void init(int _n, int a[], int b[]) {
	n = _n;
	for(int i = 0; i < n; i++) ls[a[i]].push_back(b[i]);
	root[0] = build();
	for(int i = 1; i <= n; i++) { // direction of iteration is insignificant
		root[i] = erase(root[i-1], root[0], i-1);
		for(int j = 0; j < ls[i].size(); j++) root[i] = update(root[i], ls[i][j]);
	}
	used_root = build();
}
int can(int m, int k[]) {
	sort(k, k+m);
	int used = used_root;
	for(int i = 0; i < m; i++) {
		used = erase(used, root[0], k[i]-1);
		used = query(root[k[i]], used, k[i]);
		if(used == -1) return 0;
	}
	return 1;
}

Compilation message

teams.cpp: In function 'int newLeaf(int)':
teams.cpp:13:18: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
  return t.size()-1;
                  ^
teams.cpp: In function 'int newPar(int, int)':
teams.cpp:19:18: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
  return t.size()-1;
                  ^
teams.cpp: In function 'int build(int, int)':
teams.cpp:23:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1;
             ^
teams.cpp: In function 'int update(int, int, int, int)':
teams.cpp:28:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1;
             ^
teams.cpp: In function 'int erase(int, int, int, int, int)':
teams.cpp:35:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1;
             ^
teams.cpp: In function 'int query(int, int, int, int, int)':
teams.cpp:42:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1;
             ^
teams.cpp: In function 'int get(int, int, int, int, int)':
teams.cpp:51:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid = l+r >> 1, ret = 0;
             ^
teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:62:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0; j < ls[i].size(); j++) root[i] = update(root[i], ls[i][j]);
                    ^
# Verdict Execution time Memory Grader output
1 Correct 59 ms 35608 KB Output is correct
2 Correct 58 ms 35704 KB Output is correct
3 Correct 59 ms 35936 KB Output is correct
4 Correct 59 ms 35936 KB Output is correct
5 Correct 61 ms 35936 KB Output is correct
6 Correct 72 ms 35964 KB Output is correct
7 Correct 58 ms 36520 KB Output is correct
8 Correct 58 ms 36520 KB Output is correct
9 Correct 58 ms 36520 KB Output is correct
10 Correct 66 ms 36520 KB Output is correct
11 Correct 58 ms 36520 KB Output is correct
12 Correct 95 ms 45332 KB Output is correct
13 Correct 65 ms 45332 KB Output is correct
14 Correct 61 ms 45332 KB Output is correct
15 Correct 57 ms 45332 KB Output is correct
16 Correct 58 ms 45332 KB Output is correct
17 Correct 66 ms 45332 KB Output is correct
18 Correct 63 ms 45332 KB Output is correct
19 Correct 63 ms 45332 KB Output is correct
20 Correct 61 ms 45332 KB Output is correct
21 Correct 71 ms 45332 KB Output is correct
22 Correct 61 ms 45332 KB Output is correct
23 Correct 78 ms 45332 KB Output is correct
24 Correct 59 ms 45332 KB Output is correct
25 Correct 61 ms 45332 KB Output is correct
26 Correct 59 ms 45332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 297 ms 83808 KB Output is correct
2 Correct 296 ms 83808 KB Output is correct
3 Correct 286 ms 83916 KB Output is correct
4 Correct 310 ms 83916 KB Output is correct
5 Correct 212 ms 83916 KB Output is correct
6 Correct 209 ms 83916 KB Output is correct
7 Correct 198 ms 83916 KB Output is correct
8 Correct 200 ms 83916 KB Output is correct
9 Correct 219 ms 97380 KB Output is correct
10 Correct 213 ms 97380 KB Output is correct
11 Correct 199 ms 97380 KB Output is correct
12 Correct 235 ms 97380 KB Output is correct
13 Correct 219 ms 97380 KB Output is correct
14 Correct 239 ms 97380 KB Output is correct
15 Correct 269 ms 97380 KB Output is correct
16 Correct 276 ms 97380 KB Output is correct
17 Correct 208 ms 97380 KB Output is correct
18 Correct 212 ms 97380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 296 ms 97380 KB Output is correct
2 Correct 298 ms 97380 KB Output is correct
3 Correct 626 ms 150160 KB Output is correct
4 Correct 311 ms 150160 KB Output is correct
5 Correct 398 ms 150160 KB Output is correct
6 Correct 383 ms 150160 KB Output is correct
7 Correct 210 ms 150160 KB Output is correct
8 Correct 280 ms 150160 KB Output is correct
9 Correct 252 ms 150160 KB Output is correct
10 Correct 372 ms 150160 KB Output is correct
11 Correct 375 ms 150160 KB Output is correct
12 Correct 407 ms 150160 KB Output is correct
13 Correct 542 ms 150160 KB Output is correct
14 Correct 685 ms 150160 KB Output is correct
15 Correct 468 ms 150160 KB Output is correct
16 Correct 452 ms 150160 KB Output is correct
17 Correct 362 ms 150160 KB Output is correct
18 Correct 356 ms 150160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1563 ms 290060 KB Output is correct
2 Correct 1569 ms 290060 KB Output is correct
3 Correct 2169 ms 345960 KB Output is correct
4 Correct 1498 ms 345960 KB Output is correct
5 Correct 1012 ms 357432 KB Output is correct
6 Correct 963 ms 357432 KB Output is correct
7 Correct 831 ms 357432 KB Output is correct
8 Correct 935 ms 357432 KB Output is correct
9 Correct 936 ms 357432 KB Output is correct
10 Correct 986 ms 357432 KB Output is correct
11 Correct 985 ms 357432 KB Output is correct
12 Correct 1096 ms 357488 KB Output is correct
13 Correct 1462 ms 357936 KB Output is correct
14 Correct 2309 ms 357936 KB Output is correct
15 Correct 1383 ms 357936 KB Output is correct
16 Correct 1399 ms 357936 KB Output is correct
17 Correct 958 ms 357936 KB Output is correct
18 Correct 963 ms 357936 KB Output is correct