GYM 101350 G
Old Macdonald wants to build a new hen house for his hens. He buys a new rectangular area of size N by M. The night before he builds the hen house, snake Rana devises an evil plan to plant bombs in K distinct cells in the area to kill the hens and eat them for dinner later.
The morning of, Old Macdonald notices that each of the K cells, where snake Rana planted a bomb, have a marking on them. That won’t stop him though, all he must do is build the hen house in an area with no bombs.
Assume that rows are numbered from top to bottom, and columns are numbered from left to right. Old Macdonald now wants to know the number of ways he can choose sub-rectangles of top left coordinates (x1, y1) and bottom right coordinates (x2, y2) (x1 ≤ x2) (y1 ≤ y2) such that there are no bombs in the sub rectangle.
The first line of input is T – the number of test cases.
The first line of each test case is three integers N, M, and K (1 ≤ N, M ≤ 104) (1 ≤ K ≤ 20).
The next K lines each contains distinct pair of integers x, y (1 ≤ x ≤ N) (1 ≤ y ≤ M) - where (x, y) is the coordinate of the bomb.
For each test case, output a line containing a single integer - the number of sub-rectangles that don’t contain any bombs.
3
2 2 1
2 2
6 6 2
5 2
2 5
10000 10000 1
1 1
5
257
2500499925000000
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstdlib> 5 #include <cstring> 6 #include <string> 7 #include <deque> 8 #include <set> 9 #include <queue> 10 using namespace std; 11 #define ll long long 12 #define N 10009 13 #define gep(i,a,b) for(int i=a;i<=b;i++) 14 #define gepp(i,a,b) for(int i=a;i>=b;i--) 15 #define gep1(i,a,b) for(ll i=a;i<=b;i++) 16 #define gepp1(i,a,b) for(ll i=a;i>=b;i--) 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define P pair<int,int> 19 #define inf 10000009 20 struct Node{ 21 ll x,y; 22 }node[30]; 23 int main() 24 { 25 int t,k; 26 ll n,m; 27 scanf("%d",&t); 28 while(t--) 29 { 30 scanf("%lld%lld%d",&n,&m,&k);//开始时k %lld ,t直接变为0了 31 ll ans=n*(n+1)/2*m*(m+1)/2; 32 //一共ans个,要在减去含有炸弹的,容斥定理 33 //含有炸弹的=仅含有一个的-含有两个的+含有三个的-…… 34 /* 35 要计算几个集合并集的大小,我们要先将所有单个集合的大小 36 计算出来,然后减去所有两个集合相交的部分, 37 再加回所有三个集合相交的部分, 38 再减去所有四个集合相交的部分,依此类推, 39 一直计算到所有集合相交的部分。 40 */ 41 gep(i,0,k-1){ 42 scanf("%lld %lld",&node[i].x,&node[i].y); 43 } 44 for(int i=1;i<(1<<k);i++)//二进制枚举所有的情况 45 { 46 ll m1=inf,m2=inf,m3=-1,m4=-1; 47 int cnt=0; 48 gep(j,0,k-1){ 49 if(i>>j&1){//i的j位是1吗 50 m1=min(m1,node[j].x); 51 m2=min(m2,node[j].y); 52 m3=max(m3,node[j].x); 53 m4=max(m4,node[j].y); 54 cnt++;//有几个炸弹 55 } 56 } 57 //m1 :横坐标的最小值 m2 :纵坐标的最小值 58 //m3 :横坐标的最大值 m4 :纵坐标的最大值 59 //一个矩形由左上角 和右下角 决定 60 //m1*m2 左上的位置数 ,(n-m3+1)*(m-m4+1):右下的位置数 61 ll ret=m1*m2*(n-m3+1)*(m-m4+1); 62 if(cnt&1) ans-=ret; 63 else ans+=ret; 64 } 65 printf("%lld\n",ans); 66 } 67 return 0; 68 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现