#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;} |
English