题意:给一个n*m的格子,然后给出k个石子的坐标,虫子长大于一个格子,且无限伸长知道碰到石头,虫子不能跨过石头睡。求虫子不同睡法的数目。
求大方格内有多少格子数大于1的子方格(矩形)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=140010;
struct node{
int x,y;
}node[N];
bool cmp1(struct node a,struct node b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
bool cmp2(struct node a,struct node b){
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
int main(){
int t,i,j,n,m,k;
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&n,&m,&k);
if(!k){
int ans=0;
if(m>=2)ans+=n;
if(n>=2)ans+=m;
printf("%d\n",ans);continue;
}
for(i=0;i<k;i++){
scanf("%d%d",&node[i].x,&node[i].y);
}
sort(node,node+k,cmp1);
int ans=0;
int tx=1,ty=0;
for(i=0;i<k;i++){
if(tx==node[i].x){
if(node[i].y-ty>2)ans++;
ty=node[i].y;
}else{
if(m>=2)ans+=node[i].x-tx-1;
if(m+1-ty>2)ans++;
if(node[i].y>2)ans++;
tx=node[i].x;
ty=node[i].y;
}
if(i==k-1){
if(m>=2)ans+=n-node[i].x;
if(m+1-node[i].y>2)ans++;
}
}
sort(node,node+k,cmp2);
tx=0;
ty=1;
for(i=0;i<k;i++){
if(ty==node[i].y){
if(node[i].x-tx>2)ans++;
tx=node[i].x;
}else{
if(n>=2)ans+=node[i].y-ty-1;
if(n+1-tx>2)ans++;
if(node[i].x>2)ans++;
tx=node[i].x;
ty=node[i].y;
}
if(i==k-1){
if(n>=2)ans+=m-node[i].y;
if(n+1-node[i].x>2)ans++;
}
}
printf("%d\n",ans);
}
return 0;
}