#include "dzialka.h" #include "message.h" #include <iostream> using namespace std; int i=0, j=0, n, m, is=0, a; long long sum=0, sums=0, ver[75001], st[75001], s[75001]; void push (long long a){ long long bereft=0; while (is>0&&st[is-1]>a) { is--; bereft+=s[is]; sums=sums-s[is]*st[is]; s[is]=st[is]=0; } sums=sums+(bereft+1)*a; if (is>0&&st[is-1]==a) is--; s[is]+=bereft+1; st[is]=a; is++; } void clean(){ while (is>=0){ s[is]=st[is]=0; is--; } sums=0; is=0; } int main(){ n=GetFieldHeight(); m=GetFieldWidth(); while (i<n){ while (j<m){ a=IsUsableCell(i, j); if (a==1) ver[j]++, push(ver[j]); else ver[j]=0, clean(); sum+=sums; j++; } clean(), sums=0; i++, j=0; } if (MyNodeId() > 0) return 0; cout<<sum; 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 | #include "dzialka.h" #include "message.h" #include <iostream> using namespace std; int i=0, j=0, n, m, is=0, a; long long sum=0, sums=0, ver[75001], st[75001], s[75001]; void push (long long a){ long long bereft=0; while (is>0&&st[is-1]>a) { is--; bereft+=s[is]; sums=sums-s[is]*st[is]; s[is]=st[is]=0; } sums=sums+(bereft+1)*a; if (is>0&&st[is-1]==a) is--; s[is]+=bereft+1; st[is]=a; is++; } void clean(){ while (is>=0){ s[is]=st[is]=0; is--; } sums=0; is=0; } int main(){ n=GetFieldHeight(); m=GetFieldWidth(); while (i<n){ while (j<m){ a=IsUsableCell(i, j); if (a==1) ver[j]++, push(ver[j]); else ver[j]=0, clean(); sum+=sums; j++; } clean(), sums=0; i++, j=0; } if (MyNodeId() > 0) return 0; cout<<sum; return 0;} |