#include<cstdio> #include<queue> #define MP make_pair #define fi first #define se second using namespace std; priority_queue<pair<int, int> >q; const int base = 2048; int n, i, j, x, t[base * 2]; long long int wynik; int query(int a) { int w = 0; a += base + 1; while (a > 1) { if (a % 2 == 1){w += t[a - 1];} a /= 2; } return w; } void insert(int a) { a += base; while(a > 0) { t[a]++; a /= 2; } } int main() { scanf("%d", &n); wynik = 0; for(i = 1; i <= n; i++) { for(j = i; j <= n; j++) { scanf("%d", &x); q.push(MP(x * (-1), j)); } while(query(q.top().se) >= q.top().se) { // printf("zapytanie dla %d --> %d\n", q.top().se, query(q.top().se)); q.pop(); } // printf("zapytanie dla %d --> %d\n", q.top().se, query(q.top().se)); // printf("%d koniec w %d\n", q.top().fi * (-1), q.top().se); wynik -= q.top().fi; insert(q.top().se); q.pop(); } printf("%lld\n", wynik); return 0; }
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 | #include<cstdio> #include<queue> #define MP make_pair #define fi first #define se second using namespace std; priority_queue<pair<int, int> >q; const int base = 2048; int n, i, j, x, t[base * 2]; long long int wynik; int query(int a) { int w = 0; a += base + 1; while (a > 1) { if (a % 2 == 1){w += t[a - 1];} a /= 2; } return w; } void insert(int a) { a += base; while(a > 0) { t[a]++; a /= 2; } } int main() { scanf("%d", &n); wynik = 0; for(i = 1; i <= n; i++) { for(j = i; j <= n; j++) { scanf("%d", &x); q.push(MP(x * (-1), j)); } while(query(q.top().se) >= q.top().se) { // printf("zapytanie dla %d --> %d\n", q.top().se, query(q.top().se)); q.pop(); } // printf("zapytanie dla %d --> %d\n", q.top().se, query(q.top().se)); // printf("%d koniec w %d\n", q.top().fi * (-1), q.top().se); wynik -= q.top().fi; insert(q.top().se); q.pop(); } printf("%lld\n", wynik); return 0; } |