周赛D. Digging for Gold(扫描线)
2021/11/9 23:14:18
本文主要是介绍周赛D. Digging for Gold(扫描线),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
给出二维平面上的一些点。
询问一个\(K\times K\)的正方形,最多能覆盖多少点。
做法:
考虑这个正方形的一个角。这个角确定了,正方形也就确定了。
对于一个点,合法的角的坐标范围形成了一个矩形。
问题转化为,求一些矩形的最大重合点是多少。
扫描线即可。
时间复杂度O(nlogn)。
//对一个点(x,y)来说 //一个矩形内的点是合法的 //那就二维差分 // //对每个(x,y)对应一个矩形 //求这些矩形的最大覆盖点 //用扫描线 #include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; int n,m,k; int t[maxn],mm; struct { pair<int,int> p[4]; //e表示矩形的长 }jx[maxn]; struct qnode { int l,r,v; }; vector<qnode> g[maxn]; int c[maxn<<2],lz[maxn<<2]; void pushdown (int i,int l,int r) { int mid=(l+r)>>1; if (lz[i]) { c[i<<1]+=lz[i]; lz[i<<1]+=lz[i]; c[i<<1|1]+=lz[i]; lz[i<<1|1]+=lz[i]; lz[i]=0; } } void up (int i,int l,int r,int L,int R,int v) { if (l>=L&&r<=R) { c[i]+=v; lz[i]+=v; return; } pushdown(i,l,r); int mid=(l+r)>>1; if (L<=mid) up(i<<1,l,mid,L,R,v); if (R>mid) up(i<<1|1,mid+1,r,L,R,v); c[i]=max(c[i<<1],c[i<<1|1]); } map<pair<int,int> ,int> mp; int gg[200][200]; int main () { scanf("%d%d%d",&n,&m,&k); if (k==1) { int ans=0; while (m--) { int x,y; scanf("%d%d",&x,&y); mp[{x,y}]++; ans=max(ans,mp[{x,y}]); } printf("%d\n",ans); return 0; } for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); jx[i].p[0]={x-k+1,y-k+1}; jx[i].p[1]={x,y-k+1}; jx[i].p[2]={x,y}; jx[i].p[3]={x-k+1,y}; for (int j=0;j<4;j++) { //printf("%d: %d %d\n",i,jx[i].p[j].first,jx[i].p[j].second); t[++mm]=jx[i].p[j].first; t[++mm]=jx[i].p[j].second; } } sort(t+1,t+mm+1); mm=unique(t+1,t+mm+1)-t-1; for (int i=1;i<=m;i++) { for (int j=0;j<4;j++) { jx[i].p[j].first=upper_bound(t+1,t+mm+1,jx[i].p[j].first)-t-1; jx[i].p[j].second=upper_bound(t+1,t+mm+1,jx[i].p[j].second)-t-1; } // for (int j=jx[i].p[0].first;j<=jx[i].p[1].first;j++) { // for (int kk=jx[i].p[0].second;kk<=jx[i].p[2].second;kk++) { // gg[j][kk]++; // } // } } // for (int i=1;i<=mm;i++) { // for (int j=1;j<=mm;j++) { // printf("%d ",gg[i][j]); // } // puts(""); // } // return 0; for (int i=1;i<=m;i++) { g[jx[i].p[0].first].push_back({jx[i].p[0].second,jx[i].p[3].second,1}); g[jx[i].p[1].first+1].push_back({jx[i].p[1].second,jx[i].p[2].second,-1}); } int ans=0; for (int i=1;i<=mm;i++) { for (qnode it:g[i]) { int l=it.l; int r=it.r; int v=it.v; //printf("%d %d %d %d\n",i,l,r,v); up(1,1,mm,l,r,v); } //printf("%d\n",c[1]); ans=max(ans,c[1]); } printf("%d\n",ans); } /* 1000000000 4 1000000000 1000000000 1000000000 1000000000 1 1 1000000000 1 1 */
这篇关于周赛D. Digging for Gold(扫描线)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享