Задать вопрос
Профиль пользователя заблокирован сроком «навсегда» без указания причины
  • Задача о ранжировании документов, Яндекс.Алгоритм.2015 - Алгоритмы?

    @deleted-albours Автор вопроса
    Всё-таки решил попробовать протестировать алгоритм на C++, как предложил Дмитрий в его ответе. Как и ожидалось, программа завалилась на 22 тесте с вердиктом TL.
    Собственно, ниже код программы на C++.
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <iterator>
    #include <vector>
    #include <algorithm> 
    using namespace std;
    
    vector<int> readLine();
    
    int m_N;
    int m_D;
    int m_Q;
    int m_listA[100];
    int m_listD[100000][100];
    int m_listQ[100000][4];
    int m_listR[100000];
    
    struct CPair
    {
    	int rel;
    	int num;
    };
    
    int main()
    {
    	vector<int> vars = readLine();
    	m_N = vars[0];
    	vars = readLine();
    
    	for (int n = 0; n < m_N; n++)
    		m_listA[n] = vars[n];
    
    	vars = readLine();
    	m_D = vars[0];
    
    	for (int d = 0; d < m_D; d++)
    	{
    		vars = readLine();
    		for (int n = 0; n < m_N; n++)
    		{
    			m_listD[d][n] = vars[n];
    			m_listR[d] += m_listA[n] * vars[n];
    		}
    	}
    
    	vars = readLine();
    	m_Q = vars[0];
    	for (int q = 0; q < m_Q; q++)
    	{
    		vars = readLine();
    		for (int i = 0; i < vars.size(); i++)
    			m_listQ[q][i] = vars[i];
    	}
    
    	vector<CPair> pairs(100000);
    	for(int r = 0; r < m_D; r++)
    		{
    			pairs[r].rel = m_listR[r];
    			pairs[r].num = r + 1;
    		}
    			
    	sort(pairs.begin(), pairs.begin() + m_D, 
    		[](CPair const &a, CPair const &b){ return a.rel > b.rel;});		
    
    
    	for (int q = 0; q < m_Q; q++)
    	{
    		if (m_listQ[q][0] == 1)
    		{	
    			for (int i = 0; i < m_listQ[q][1]; i++)
    				cout << pairs[i].num << " ";
    			cout<<endl;
    		}
    		else
    		{
    			int d = m_listQ[q][1] - 1;
    			int j = m_listQ[q][2] - 1;
    			int v = m_listQ[q][3];
    				
    			int oldPart = m_listD[d][j] * m_listA[j];
    			int newPart = v * m_listA[j];
    			int div = oldPart - newPart;
    			m_listR[d] -= div;
    			m_listD[d][j] = v;
    
    			for (int i = 0; i < m_D; i++)
    			{
    				if (pairs[i].num == (d + 1))
    				{
    					pairs[i].rel = m_listR[d];
    					sort(pairs.begin(), pairs.begin() + m_D, 
    						[](CPair const &a, CPair const &b){ return a.rel > b.rel;});
    					break;
    				}
    			}
    
    		}
    	}
    	//system("pause");
    	return 0;
    }
    
    vector<int> readLine()
    {
    	string input = "";
    	getline(cin, input);
    
    	istringstream iss(input);
    	vector<int> vars;
    	copy(istream_iterator<int>(iss),
    		istream_iterator<int>(),
    		back_inserter(vars));
    
    	return vars;
    }
    Ответ написан