题目

July 5, 2021 · View on GitHub

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 Specification

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 (0 <= m,n,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 Specification

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<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int T,n,m,k,x[1000005],y[1000005],b[1000005];
int dealrow(){
    int cnt=0,Trow=0;
    int mark[1000005];
    int ans=0;
    memset(mark,0,sizeof(mark));
    for(int i=0;i<k;i++){
        if(mark[x[i]]==1) continue;
        mark[x[i]]=1;
        Trow++;
        cnt=0;
        b[cnt++]=y[i];
        for(int j=i+1;j<k;j++){
            if(x[j]==x[i]){
                b[cnt++]=y[j];    
            }
        }
        sort(b,b+cnt);
        for(int j=0;j<cnt-1;j++){
            if(b[j+1]-b[j]>2) {ans++;}
        }
        if(b[0]>2) {ans++;}
        if(b[cnt-1]<=n-2&&n>=3){ans++;}
    }
    if(n>=2) ans+=(m-Trow);
    return ans;
}

int dealcolumn(){
    int cnt=0,Tcolumn=0;
    int mark[1000005];
    int ans=0;
    memset(mark,0,sizeof(mark));
    for(int i=0;i<k;i++){
        if(mark[y[i]]==1) continue;
        Tcolumn++;
        cnt=0;
        b[cnt++]=x[i];
        mark[y[i]]=1;
        for(int j=i+1;j<k;j++){
            if(y[j]==y[i]){
                b[cnt++]=x[j];
            }
        }
        sort(b,b+cnt);
        for(int j=0;j<cnt-1;j++){
            if(b[j+1]-b[j]>2) ans++;
        }
        if(b[0]>2) {ans++;}
        if(b[cnt-1]<=m-2&&m>=3) {ans++;}
    }
    if(m>=2) ans+=(n-Tcolumn);
    return ans;
}

int main(){
    while(~scanf("%d",&T)){
        while(T--){
            scanf("%d %d %d",&m,&n,&k);
            for(int i=0;i<k;i++){
                scanf("%d %d",&x[i],&y[i]);
            }
            int Tans=0;
            Tans+=dealrow();
            Tans+=dealcolumn();
            printf("%d\n",Tans);
        }
    }
return 0;
}