#include <iostream> #include "maklib.h" #include "message.h" #include <assert.h> using namespace std; typedef long long LL; struct typ { LL wynik; LL prefiks; LL sufiks; LL suma; }; typ drzewo[2000001]; LL N; LL s; void napraw(LL k) { drzewo[k].suma = drzewo[2 * k].suma + drzewo[2 * k + 1].suma; drzewo[k].prefiks = max(drzewo[2 * k].prefiks, drzewo[2 * k].suma + drzewo[2 * k + 1].prefiks); drzewo[k].sufiks = max(drzewo[2 * k + 1].sufiks, drzewo[2 * k + 1].suma + drzewo[2 * k].sufiks); drzewo[k].wynik = max(max(drzewo[2 * k].wynik, drzewo[2 * k + 1].wynik), drzewo[2 * k].sufiks + drzewo[2 * k + 1].prefiks); if(k > 1) napraw(k / 2); } void poprawiaj_rekurencyjnie(LL k, LL wartosc) { LL nowy = s + k - 1; if(wartosc > 0) { drzewo[nowy].wynik = wartosc; drzewo[nowy].prefiks = wartosc; drzewo[nowy].sufiks = wartosc; drzewo[nowy].suma = wartosc; } else { drzewo[nowy].wynik = 0; drzewo[nowy].prefiks = 0; drzewo[nowy].sufiks = 0; drzewo[nowy].suma = wartosc; } napraw(nowy / 2); } int main() { if(MyNodeId() == 1) { N = Size(); s = 1; while(s < N) s = s * 2; for(LL i = s; i < s + N; i++) { LL a = ElementAt(i - s + 1); if(a > 0) { drzewo[i].wynik = a; drzewo[i].prefiks = a; drzewo[i].sufiks = a; drzewo[i].suma = a; } else { drzewo[i].wynik = 0; drzewo[i].prefiks = 0; drzewo[i].sufiks = 0; drzewo[i].suma = a; } } for(LL i = s + N ; i < 2 * s; i++) { drzewo[i].wynik = 0; drzewo[i].prefiks = 0; drzewo[i].sufiks = 0; drzewo[i].suma = 0; } for(LL k = s - 1; k >= 1; k--) { drzewo[k].suma = drzewo[2 * k].suma + drzewo[2 * k + 1].suma; drzewo[k].prefiks = max(drzewo[2 * k].prefiks, drzewo[2 * k].suma + drzewo[2 * k + 1].prefiks); drzewo[k].sufiks = max(drzewo[2 * k + 1].sufiks, drzewo[2 * k + 1].suma + drzewo[2 * k].sufiks); drzewo[k].wynik = max(max(drzewo[2 * k].wynik, drzewo[2 * k + 1].wynik), drzewo[2 * k].sufiks + drzewo[2 * k + 1].prefiks); } cout << drzewo[1].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 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 | #include <iostream> #include "maklib.h" #include "message.h" #include <assert.h> using namespace std; typedef long long LL; struct typ { LL wynik; LL prefiks; LL sufiks; LL suma; }; typ drzewo[2000001]; LL N; LL s; void napraw(LL k) { drzewo[k].suma = drzewo[2 * k].suma + drzewo[2 * k + 1].suma; drzewo[k].prefiks = max(drzewo[2 * k].prefiks, drzewo[2 * k].suma + drzewo[2 * k + 1].prefiks); drzewo[k].sufiks = max(drzewo[2 * k + 1].sufiks, drzewo[2 * k + 1].suma + drzewo[2 * k].sufiks); drzewo[k].wynik = max(max(drzewo[2 * k].wynik, drzewo[2 * k + 1].wynik), drzewo[2 * k].sufiks + drzewo[2 * k + 1].prefiks); if(k > 1) napraw(k / 2); } void poprawiaj_rekurencyjnie(LL k, LL wartosc) { LL nowy = s + k - 1; if(wartosc > 0) { drzewo[nowy].wynik = wartosc; drzewo[nowy].prefiks = wartosc; drzewo[nowy].sufiks = wartosc; drzewo[nowy].suma = wartosc; } else { drzewo[nowy].wynik = 0; drzewo[nowy].prefiks = 0; drzewo[nowy].sufiks = 0; drzewo[nowy].suma = wartosc; } napraw(nowy / 2); } int main() { if(MyNodeId() == 1) { N = Size(); s = 1; while(s < N) s = s * 2; for(LL i = s; i < s + N; i++) { LL a = ElementAt(i - s + 1); if(a > 0) { drzewo[i].wynik = a; drzewo[i].prefiks = a; drzewo[i].sufiks = a; drzewo[i].suma = a; } else { drzewo[i].wynik = 0; drzewo[i].prefiks = 0; drzewo[i].sufiks = 0; drzewo[i].suma = a; } } for(LL i = s + N ; i < 2 * s; i++) { drzewo[i].wynik = 0; drzewo[i].prefiks = 0; drzewo[i].sufiks = 0; drzewo[i].suma = 0; } for(LL k = s - 1; k >= 1; k--) { drzewo[k].suma = drzewo[2 * k].suma + drzewo[2 * k + 1].suma; drzewo[k].prefiks = max(drzewo[2 * k].prefiks, drzewo[2 * k].suma + drzewo[2 * k + 1].prefiks); drzewo[k].sufiks = max(drzewo[2 * k + 1].sufiks, drzewo[2 * k + 1].suma + drzewo[2 * k].sufiks); drzewo[k].wynik = max(max(drzewo[2 * k].wynik, drzewo[2 * k + 1].wynik), drzewo[2 * k].sufiks + drzewo[2 * k + 1].prefiks); } cout << drzewo[1].wynik; } return 0; } |