当前位置: 首页 > news >正文

矩形计数

考虑容斥:计数没有任意一个点的矩形个数。

首先长宽分别为 \(x,y\) 的矩形的所有子矩形个数为:

\[\frac {x (x+1) y(y+1)} 4 \]

按横坐标排序,如果限制左边的取值在相邻两个点之间,并且限制上下界,其右边的范围可以确定。

如上图,限制左边在第零个点与第一个点之间。发现蓝绿色矩形间会有重(矩形 \((1,1),(7,7)\) 和矩形 \((1,8),(7,10)\)),直接容斥减掉。

当两个点的时候,我们发现左限制有重(矩形 \((5,1),(7,4)\) 和矩形 \((5,6),(7,8)\) 等),容斥减掉。

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Fast_OI{char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)#define putchar(x) (p3-obuf<1000000?*p3++=x:(fwrite(obuf,1,p3-obuf,stdout),p3=obuf,*p3++=x))int read(){int x=0;bool f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=0;c=getchar();}while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}void puts(const char* str){while(*str!='\0')putchar(*str ++); putchar('\n'); }void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);} void flush() { fwrite(obuf,1,p3-obuf,stdout); }
}using namespace Fast_OI;
const int N=1e3+5;
const int mod=1e9+7;
int n,m,ans;
int k;
pair<int,int> a[N];
set<pair<int,pair<int,int> > > s;
inline int calc(int x,int y){if(x<=0||y<=0)	return 0;return (x*(x+1)/2%mod)*(y*(y+1)/2%mod)%mod;
}
signed main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);n=read(),m=read(),k=read();for(int i=1;i<=k;i++)a[i]=make_pair(read(),read());sort(a+1,a+1+k);a[k+1]=make_pair(n,0);for(int i=0;i<=k;i++){s.clear();s.insert(make_pair(1,make_pair(m,a[i].first)));for(int j=i+1;j<=k;j++){auto ir=s.upper_bound(make_pair(a[j].second,make_pair(m+1,m+1)));auto il=ir;if(il!=s.begin())	il--;else	continue;int l=il->first,r=il->second.first,v=il->second.second;if(l>a[j].second||r<a[j].second)continue;s.erase(il);ans-=calc(v-a[i].first,r-l+1);ans+=calc(v-a[i+1].first,r-l+1);ans+=calc(a[j].first-1-a[i].first,r-l+1);ans-=calc(a[j].first-1-a[i+1].first,r-l+1);ans%=mod;if(ans<0)	ans+=mod;if(l<a[j].second)s.insert(make_pair(l,make_pair(a[j].second-1,a[j].first-1)));if(r>a[j].second)s.insert(make_pair(a[j].second+1,make_pair(r,a[j].first-1)));}for(auto it=s.begin();it!=s.end();it++){int l=it->first,r=it->second.first,v=it->second.second;ans-=calc(v-a[i].first,r-l+1);ans+=calc(v-a[i+1].first,r-l+1);ans+=calc(n-a[i].first,r-l+1);ans-=calc(n-a[i+1].first,r-l+1);ans%=mod;if(ans<0)	ans+=mod;}}ans=(calc(n,m)-ans+mod)%mod;printf("%lld",ans);return 0;
}
http://www.jsqmd.com/news/554837/

相关文章:

  • 通义千问2.5-7B-Instruct快速部署:vLLM+WebUI一站式解决方案
  • 为什么C++开发者需要关注LunaSVG这个SVG渲染库?
  • 【限时技术白皮书】Cuvil编译器v2.5新增MLIR-AI方言详解:支持LoRA微调后自动融合的唯一开源方案
  • 手把手教你搭建游戏账号交易平台:从源码到上线全流程(附常见问题解决方案)
  • BiliBili-UWP:Windows平台上的B站原生体验终极指南
  • OpenInTerminal:重塑macOS开发工作流的效率革命工具
  • Depth Pro:重新定义单目度量深度估计的实时性与精度标准
  • Valence:用Rust构建高性能Minecraft服务器的终极指南
  • 如何快速掌握数据库可视化操作:Beekeeper Studio完整指南
  • 告别打印烦恼:Anycubic i3 Mega定制Marlin固件的全方位升级方案
  • OpenFOAM并行计算从入门到精通:四种网格划分方法实战与collated格式解析
  • 从寄存器到SysConfig:TMS320F28388D的SCI+RS485配置,我踩过的那些坑
  • Windows系统权限管理的终极指南:深入解析NSudo高级权限控制技术
  • RMBG-2.0场景应用:广告素材制作,快速分离主体与背景
  • 内存故障诊断实战:Memtest86+从入门到精通
  • 攻克Ruffle扩展失效难题:从诊断到适配的全方位技术方案
  • ComfyUI FramePackWrapper:解锁AI视频创作的智能转换引擎
  • XHS-Downloader终极指南:快速掌握小红书无水印下载技巧
  • 构建高性能语音识别API:FastAPI与Whisper实战指南 [特殊字符]
  • 5分钟部署AI万能分类器:可视化WebUI操作全解析
  • SoccerData:一站式足球数据抓取与分析工具实战指南
  • Youtu-2B日志监控方案:运维可视化部署案例
  • 告别误报!用Holmes-VAD和VAD-Instruct50K数据集,让AI看懂监控视频里的‘不对劲’
  • 实战分享:我用Swift-All+腾讯云T4,三天微调出专属客服机器人
  • 开源StructBERT模型实战:nlp_structbert_sentence-similarity_chinese-large与Sentence-BERT对比分析
  • 手把手教你用frp实现私人云盘外网访问:解决内网穿透的常见问题
  • LFM2.5-1.2B-Thinking-GGUF实操手册:修改默认max_tokens参数并持久化配置方法
  • SciPy稀疏矩阵存储与求解器详解:从基础到高级应用的完整指南
  • SharpKeys终极指南:5分钟学会Windows键盘定制技巧
  • 6步精通PathOfBuilding:面向流放之路玩家的离线构建工具指南