The Happy Worm lives in an m*n rectangular field. There are k stones placed in certain locations of the field. (Each square of the field is either empty, or contains a stone.) Whenever the worm sleeps, it lies either horizontally or vertically, and stretches so that its length increases as much as possible. The worm will not go in a square with a stone or out of the field. The happy worm can not be shorter than 2 squares.
The question you are to answer is how many different positions this worm could be in while sleeping.
Input
The first line of the input file contains a single integer t (1 ≤ t ≤ 11), the number of test cases, followed by the input data for each test case. The first line of each test case contains three integers m, n, and k (1 ≤ m,n ≤ 10000, 0 ≤ k ≤ 200000). The input for this test case will be followed by k lines. Each line contains two integers which specify the row and column of a stone. No stone will be given twice.
Output
There should be one line per test case containing the number of positions the happy worm can be in.
Sample Input
1 5 5 6 1 5 2 3 2 4 4 2 4 3 5 1
Sample Output
9
#include <iostream> #include <memory.h> using namespace std; bool f[10010][10010]; int main(){ int t,i,j,m,n,k,r,c,s,e,ans; cin>>t; while(t--){ cin>>m>>n>>k; memset(f,0,sizeof(f)); ans = 0; for(i=0;i<k;i++){ cin>>r>>c; f[r][c] = true; } for(i=0;i<=m+1;i++){ f[i][0] = true; f[i][n+1] = true; } for(i=0;i<=n+1;i++){ f[0][i] = true; f[m+1][i] = true; } for(i=1;i<=m;i++){ for(j=1;j<=n+1;){ while(f[i][j]){ j++; } if(j>n) break; if(!f[i][j]){ s = j;//cout<<"s "<<i<<" "<<j<<endl; j++; e = s; } while(!f[i][j]){ e = j; j++; } //cout<<"e "<<i<<" "<<j-1<<endl; if(e-s+1>1) ans++; //cout<<e-s+1<<endl; } } for(j=1;j<=n;j++){ for(i=1;i<=m;){ while(f[i][j]){ i++; } if(i>m) break; if(!f[i][j]){ s = i;//cout<<"s "<<i<<" "<<j<<endl; i++; e = s; } while(!f[i][j]){ e = i; i++; }//cout<<"e "<<i-1<<" "<<j<<endl; if(e-s+1>1) ans++; //cout<<e-s+1<<endl; } } cout<<ans<<endl; } return 0; }
Source: Tehran 2004 Iran Nationwide