G. Snake Rana 容斥原理
题意: 统计网格矩形的子矩形数目,其中要求每个格子不能包含一些特殊格子(特殊格子小于20)
思路:统计格子是个老问题,sum=n*(n+1)/2*m*(m+1)/2 这里要求一些格子不合法,显然用总答案减去非法答案更容易计算。
计算非法答案时k<=20是一个提示算是,我们可以直接枚举包含的非法格子数目,然后再容斥就好。
代码:
#include<bits/stdc++.h> using namespace std; #define MEM(a,b) memset(a,b,sizeof(a)) #define PB push_back #define MP make_pair #define X first #define Y second #define bug puts("bug"); typedef long long ll; typedef pair<ll,ll> pii; const double PI=acos(-1); pii p[30]; int tmp[10]; ll sum; ll t,a,b,n,m,k; void dfs(int id,int pp,ll lux,ll luy,ll rdx,ll rdy){ if(pp==1) sum-=lux*luy*(n-rdx+1)*(m-rdy+1); else sum+=lux*luy*(n-rdx+1)*(m-rdy+1); for(int i=id+1;i<k;i++){ dfs(i,pp^1,min(lux,p[i].X),min(luy,p[i].Y),max(rdx,p[i].X),max(rdy,p[i].Y)); } } int main(){ cin>>t; while(t--){ cin>>n>>m>>k; sum=m*(m+1)/2*n*(n+1)/2; for(int i=0;i<k;i++) cin>>p[i].X>>p[i].Y; for(int i=0;i<k;i++) dfs(i,1,p[i].X,p[i].Y,p[i].X,p[i].Y); cout<<sum<<endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步