第11回日本情報オリンピック 本選 「釘(Nails)」 AOJ0574
解法は顕著でいもす法やるだけなんだけど、メモリの制限がやたらと厳しいと言う問題。
ACしたあと、もしかしたらと思い、"解答例(元 IOI 日本代表選手が作成した C++ サンプルソース)"をAOJに投げてみたらなんと"MLE"だったのでAOJ側の問題なのか??
#include <bits/stdc++.h> using namespace std; //int d[5500][5500]; int main(){ int n,m; scanf("%d%d",&n,&m); vector<int> d[n+10]; for(int i = 0;i < n+5;i++)d[i].resize(i+10); for(int i = 0;i < n+5;i++) for(int j = 0;j < i+1;j++) d[i][j] = 0; for(int i = 0;i < m;i++){ int a,b,x; scanf("%d%d%d",&a,&b,&x); d[a][b]++; d[a][b+1]--; d[a+x+1][b]--; d[a+x+2][b+1]++; d[a+x+1][b+x+2]++; d[a+x+2][b+x+2]--; } for(int i = 0;i <= n;i++){ for(int j = 1;j <= i+2;j++){ d[i][j] += d[i][j-1]; } } for(int i = 1;i <= n;i++){ for(int j = 0;j <= i+2;j++){ d[i][j] += d[i-1][j]; } } for(int i = 1;i <= n;i++){ for(int j = 1;j <= i+2;j++){ d[i][j] += d[i-1][j-1]; } } int ans = 0; for(int i = 0;i <= n;i++){ for(int j = 0;j <= i+2;j++){ if(d[i][j] > 0)ans++; } } printf("%d\n",ans); return 0; }