Форум программистов, компьютерный форум CyberForum.ru

Оптимизировать и ускорить программу - C++

Восстановить пароль Регистрация
 
Vaderkos
 Аватар для Vaderkos
75 / 75 / 3
Регистрация: 31.03.2015
Сообщений: 402
10.01.2016, 16:47     Оптимизировать и ускорить программу #1
Оптимизировать и ускорить программу. Нужно любое увеличение скорости работы. Может циклы как то подрихтовать, или количество переменных уменьшить. Что она делает.

Дана квадратная матрица M размера n, элементы которой - целые числа.
Дальше R=(m(0), m(1), ..., m(k-1)) массив состоящий из k подматриц матрицы M.
1. Определить количество уникальных сумм подматриц(klasa abstrakcji (не знаю как правильно перевести) из R. 2. Определить количество сумм которые встречались больше всего раз. 3. Найти целую часть среднего арифметического всех сумм.
Ввод
n k
матрица размера n
k-количество координат для подматриц
(две координаты левого угла, две - правого)
Вывод
Пункт1 Пункт2 Пункт3

Ограничения
n [1 ; 10^4], k [1 ; 10^8], M - целые числа [-10^3,10^3]
Лимиты
По времени O(n^2+klgk), по памяти O(n^2+k)

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;;Ввод
4 8        ;;n k
-2 -2 -3 1     ;;\
3 0 1 3        ;;| сама матрица
1 3 -3 3       ;;|
2 0 0 -2       ;;/
0 0 2 1 ;;\
2 2 2 3 ;;|
1 2 1 3 ;;|Координаты для подматриц
3 2 3 3 ;;|
3 0 3 3 ;;|
0 1 2 1 ;;|
3 3 3 3 ;;|
1 3 1 3 ;;/
;;Вывод:
5 3 0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <map>
#define gc getchar_unlocked
#define pc putchar_unlocked
 
using namespace std;
 
void scan_integer(int* o){
    register int c = gc();
    int x = 0;
    int neg = 0;
    for( ; ((c<48 || c>57) && c != '-'); c = gc() );
    if( c == '-' ) {
        neg = 1;
        c = gc();
    }
    for( ;c>47 && c<58; c = gc() ) {
        x = (x << 1) + (x << 3) + c - 48;
    }
    if( neg )
        x = -x;
    *o = x;
}
 
void lprint(long long int a){
    if(a == 0){
        pc('0');
    }else{
        int i=0;
    bool is_neg = false;
    if (a < 0)
    {
        is_neg = true;
        a *= -1;
    }
    char S[20];
    while(a>0){
        S[i++]=a%10+'0';
        a=a/10;
    }
    if (is_neg) S[i++] = '-';
    i--;
    while(i>=0)
    pc(S[i--]);
    } 
}
 
 
int main() {
    int size, subs_amount;
    map<long long int, long long int> my_map;
    scan_integer(&size);
    scan_integer(&subs_amount);
    
    long long int **my_matrix = new long long int*[size];
    for(int i=0;i<size;i++)
        my_matrix[i] = new long long int [size];
    
    
    for(int i = 0; i < size; i++){
        for(int j = 0; j < size; j++){
            int tmp; scan_integer(&tmp);
            if(i==0 && j==0)
                my_matrix[i][j] = tmp;
            else if(i==0 && j!= 0)
                my_matrix[i][j]  = my_matrix[i][j-1] + tmp;
            else if(i != 0 && j == 0)
                my_matrix[i][j] = my_matrix[i-1][j] + tmp;
            else
                my_matrix[i][j] = my_matrix[i][j-1] + my_matrix[i-1][j] - my_matrix[i-1][j-1] + tmp;
        }
    }
    
    
    long long int temp_sum;
    long long int sum = 0;
    long long int max = 1;
    long long int tmp = 0;
    long long int cnt = 0;
    long long int abstr= 0;
    
    
    for(int i = 0; i < subs_amount; i++){
        int a, b, c, d;
        scan_integer(&a);
        scan_integer(&b);
        scan_integer(&c);
        scan_integer(&d);
        
        temp_sum = my_matrix[c][d];
        
        if(a > 0)
            temp_sum = temp_sum - my_matrix[a-1][d];
        if(b > 0)
            temp_sum = temp_sum - my_matrix[c][b-1];
        if(a > 0 && b > 0)
            temp_sum = temp_sum + my_matrix[a-1][b-1];
            
        
        if(my_map.find(temp_sum) == my_map.end()){
            abstr++;
            my_map.insert(pair<long long int, long long int>(temp_sum, 1));
        }else{
            tmp = my_map.at(temp_sum) + 1;
            my_map.at(temp_sum) = tmp;
            if(tmp > max)
                max = tmp;
        }   
        sum += temp_sum;
    }
    
    for(map<long long int, long long int>::const_iterator it = my_map.begin(); it != my_map.end(); it++){
        if(it->second == max)
            cnt++;
    }
    lprint(abstr); pc(' ');
    lprint(cnt); pc(' ');
    lprint(sum/subs_amount);
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2016, 16:47     Оптимизировать и ускорить программу
Посмотрите здесь:

C++ Нужно ускорить код
Резать прямоугольник, пока от него не останутся только квадраты. Посчитать их количество. (Оптимизировать программу) C++
Как ускорить работу? C++
C++ Ускорить обход дерева
C++ Как ускорить готовую программу?
C++ Как ускорить программу за счет большей загруженности процессора?
Ускорить выполнение расчета CRC32 C++
C++ Нужно оптимизировать программу сложность с циклами и условными операторами

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 13:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru