Member 13571185 Ответов: 2

Почему я получаю TLE, когда мой алгоритм должен уложиться в срок ?


Страница Конкурса | CodeChef[^]
Я использовал разложение квадратного корня для решения вышеприведенного вопроса, но я не понимаю, почему я получаю TLE ? Я думаю, что есть что-то дополнительное в онлайн-судьях или STL, что я должен был знать...

Что я уже пробовал:

#include <bits/stdc++.h>
using namespace std;
void preprocess(unordered_map<int, int> m[], int block_size, int n, vector<int> v[], vector<int> arr) {
	int block_index = -1;
	int x = 0;
	for (int i = 0; i < n; i++) {
		if(i % block_size == 0) block_index++;
		x ^= arr[i];
		v[block_index].push_back(x);
		m[block_index][x]++;
	}
}
int main() {
	int n, q; cin>>n>>q;
	int block_size = ceil(sqrt(n));
	unordered_map<int, int> m[block_size];
	vector<int> v[block_size], arr;
	int lazyxor[block_size] = {0};
	for (int i = 0; i < n; i++) {
		int temp; cin>>temp;
		arr.push_back(temp);
	}
	preprocess(m, block_size, n, v, arr);
	//--------------------------------------------divided into blocks
	while(q--) {
		int a, i, k;
		cin>>a>>i>>k;
		i--;
		int block_index = i/block_size;
		int offset = i%block_size;
		if(a == 1) {
			int xorval = arr[i]^k;
			if(offset != 0) {
				for (int o = 0; o < offset; o++) {
					m[block_index][v[block_index][o]]--;
					m[block_index][v[block_index][o]^lazyxor[block_index]]++;
					v[block_index][o] ^= lazyxor[block_index];
				}
				int xorval2 = xorval^lazyxor[block_index];
				while(offset < v[block_index].size()) {
					m[block_index][v[block_index][offset]]--;
					m[block_index][v[block_index][offset]^xorval2]++;
					v[block_index][offset] ^= xorval2;
					offset++;
				}
				lazyxor[block_index] = 0;
				block_index++;
			}
			while(block_index != block_size - 1) {
				lazyxor[block_index] ^= xorval;
				block_index++;
			}
			arr[i] = k;
		}
		else {
			int count = 0;
			for (int i = 0; i < block_index; i++) {
				count += m[i][lazyxor[i]^k];
			}
			for (int i = 0; i <= offset; i++) {
				if(v[block_index][i] == (lazyxor[block_index]^k)) count++;
			}
			cout<<count<<endl;
		}
	}
}

Richard MacCutchan

Спросите людей в CodeChef.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
но я не понимаю, почему я получаю TLE ? Я думаю, что есть что-то дополнительное в онлайн-судьях или STL, что я должен был знать...

Причина проста: с проблемами CodeChef прямой ответ никогда не является правильным ответом, даже если результаты верны.
Вы можете систематически считать, что очень тщательный анализ проблемы откроет математическое свойство или преобразование, которые приведут к огромным упрощениям и ускорению. Даже достаточно быстрый (общего назначения) алгоритм будет выполняться математическим свойством.

Иначе говоря, это вызов, потому что есть умное обращение.

Я не изучал этот вызов, но использование Исключающее или пахнет примерно так же.


Рейтинг:
1

Dave Kreskowiak

Потому что ваш код не заканчивается в отведенное время. Да, это может быть быстрее, чем время, необходимое для вашей машины, но ваша машина не судья.

Код должен работать лучше, чем время на машине, выполняющей судейство, которое может быть медленнее, чем ваше.

Я не могу дать вам ответ. Это было бы жульничеством. Все, что я могу вам сказать, это то, что ваш код, как бы это сказать, "чрезмерно сложен".


Member 13571185

Теперь соревнование окончено ... вы можете сказать мне, в чем заключается сложность...

Dave Kreskowiak

Вы можете сами посмотреть успешные решения. Просто вернитесь на верхнюю страницу и нажмите кнопку "+" рядом с надписью "успешные заявки". Рядом с каждым из них есть кнопка просмотра.