#include <iostream> #include <cstdio> #include <stack> #include "message.h" #include "dzialka.h" using namespace std; const int N=75000; int id, num=100, n, m; long long anss, t[N], ans[N]; stack< int > S; int main() { id=MyNodeId(); if(id==1) { n=GetFieldHeight(); m=GetFieldWidth(); for(int i=1;i<=n;i++) t[i]=1; for(int i=1;i<=n;i++) { S.push(0); t[0]=i+1; for(int j=1;j<=m;j++) { ans[j]=0; bool c=IsUsableCell(i-1,j-1); if(!c) t[j]=i+1; while(!S.empty() && t[S.top()]<=t[j]) S.pop(); if(!S.empty()) { ans[j]+=ans[S.top()]; ans[j]+=(j-S.top())*(i+1-t[j]); } S.push(j); anss+=ans[j]; } while(!S.empty()) S.pop(); } printf("%lld", anss); } 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 | #include <iostream> #include <cstdio> #include <stack> #include "message.h" #include "dzialka.h" using namespace std; const int N=75000; int id, num=100, n, m; long long anss, t[N], ans[N]; stack< int > S; int main() { id=MyNodeId(); if(id==1) { n=GetFieldHeight(); m=GetFieldWidth(); for(int i=1;i<=n;i++) t[i]=1; for(int i=1;i<=n;i++) { S.push(0); t[0]=i+1; for(int j=1;j<=m;j++) { ans[j]=0; bool c=IsUsableCell(i-1,j-1); if(!c) t[j]=i+1; while(!S.empty() && t[S.top()]<=t[j]) S.pop(); if(!S.empty()) { ans[j]+=ans[S.top()]; ans[j]+=(j-S.top())*(i+1-t[j]); } S.push(j); anss+=ans[j]; } while(!S.empty()) S.pop(); } printf("%lld", anss); } return 0; } |