BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604
题意:
平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9)。
给定r,当两个点的曼哈顿距离<=r时,认为这两个点在同一个“群”中。
问你共有多少个群,以及点的数量最多的群有多少个点。
题解:
本题的核心在于:如何枚举一个点周围满足“曼哈顿距离<=r”的点。
由于 曼哈顿距离 = |x1 - x2| + |y1 - y2|。
x和y相互影响,不能单纯按x或y排序,枚举所有点总复杂度为O(N^2)。
所以要用到曼哈顿距离的另一种形式:
设X = x + y , Y = x - y
d(曼哈顿距离) = max(|X1-X2|, |Y1-Y2|)
将每个点的X = x + y,Y = x - y,这就将X与Y的关系分离开了。
将所有点按X排序。
当前考虑到点i。
用一个队列(X升序),保证队列中的所有X满足要求,否则不断删去队首。
用一个multiset(Y升序),找到i的前驱pre和后继suc,如果i与pre(或suc)的Y满足要求,则合并(并查集)。
最后统计一下每个群就好了。
AC Code:
1 // |x1-x2| + |y1-y2| 2 // | (x1+y1) - (x2+y2) | 3 // | (x1-y1) - (x2-y2) | 4 // X = x + y 5 // Y = x - y 6 // d = max(|X1-X2|, |Y1-Y2|) <= r 7 #include <iostream> 8 #include <stdio.h> 9 #include <string.h> 10 #include <algorithm> 11 #include <set> 12 #define MAX_N 100005 13 #define INF 100000000 14 15 using namespace std; 16 17 struct Coor 18 { 19 int x; 20 int y; 21 int idx; 22 Coor(int _x,int _y,int _idx) 23 { 24 x=_x; 25 y=_y; 26 idx=_idx; 27 } 28 Coor(){} 29 friend bool operator < (const Coor &a,const Coor &b) 30 { 31 return a.y!=b.y?a.y<b.y:a.idx<b.idx; 32 } 33 }; 34 35 int n,r; 36 int ans=1; 37 int counter=0; 38 int head=0; 39 int par[MAX_N]; 40 int cnt[MAX_N]; 41 Coor c[MAX_N]; 42 multiset<Coor> mst; 43 44 inline bool cmp_x(const Coor &a,const Coor &b) 45 { 46 return a.x<b.x; 47 } 48 49 void init_union_find() 50 { 51 for(int i=0;i<n;i++) 52 { 53 par[i]=i; 54 } 55 } 56 57 int find(int x) 58 { 59 return par[x]==x?x:par[x]=find(par[x]); 60 } 61 62 void unite(int x,int y) 63 { 64 int px=find(x); 65 int py=find(y); 66 if(px==py) return; 67 par[px]=py; 68 } 69 70 void read() 71 { 72 cin>>n>>r; 73 int a,b; 74 for(int i=0;i<n;i++) 75 { 76 cin>>a>>b; 77 c[i].x=a+b; 78 c[i].y=a-b; 79 c[i].idx=i; 80 } 81 } 82 83 void solve() 84 { 85 init_union_find(); 86 sort(c,c+n,cmp_x); 87 mst.insert(Coor(0,INF,0)); 88 mst.insert(Coor(0,-INF,0)); 89 mst.insert(c[head]); 90 for(int i=1;i<n;i++) 91 { 92 while(c[i].x-c[head].x>r) 93 { 94 mst.erase(c[head]); 95 head++; 96 } 97 multiset<Coor>::iterator it=mst.lower_bound(c[i]); 98 Coor suc=*it; 99 Coor pre=*--it; 100 if(c[i].y-pre.y<=r) unite(pre.idx,c[i].idx); 101 if(suc.y-c[i].y<=r) unite(suc.idx,c[i].idx); 102 mst.insert(c[i]); 103 } 104 memset(cnt,0,sizeof(cnt)); 105 for(int i=0;i<n;i++) 106 { 107 int p=find(i); 108 if(cnt[p]==0) counter++; 109 cnt[p]++; 110 ans=max(ans,cnt[p]); 111 } 112 } 113 114 void print() 115 { 116 cout<<counter<<" "<<ans<<endl; 117 } 118 119 int main() 120 { 121 read(); 122 solve(); 123 print(); 124 }
转载于:https://www.cnblogs.com/Leohh/p/7599009.html
BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...相关推荐
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(切比雪夫距离+multiset贪心+并查集)
1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1092 S ...
- 【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set...
题目描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个"群".每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Y ...
- BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】
1612: [Usaco2008 Jan]Cow Contest奶牛的比赛 Time Limit: 5 Sec Memory Limit: 64 MB Description FJ的N(1 <= ...
- bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车(贪心)
1623: [Usaco2008 Open]Cow Cars 奶牛飞车 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 578 Solved: 402 ...
- bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd)
1612: [Usaco2008 Jan]Cow Contest奶牛的比赛 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1153 Solved: 7 ...
- bzoj 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛(BFS)
1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1293 Solved ...
- BZOJ 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛【DP】
1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec Memory Limit: 64 MB Description 奶牛们在被划分成N ...
- BZOJ 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 bfs
1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1290 Solved ...
- bzoj 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通(拓扑排序?+DP)
1638: [Usaco2007 Mar]Cow Traffic 奶牛交通 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 971 Solved: 37 ...
最新文章
- python学习笔记(3) -- 常用数据类型
- android 自定义dialog 定时关闭,Android编程实现自定义Dialog的大小自动控制方法示例...
- IHttpHandler的学习(0)
- linux 共享内存_盘点那些linux 后台开发类常见问题及知识点
- KVO 从基本使用到原理剖析
- C#程序中设置全局代理(Global Proxy)
- 如何在linux操作系统中安装oracle数据库,并设置开机自启动
- python bool类型如何与整数比较_Python入门必读bool类型和比较运算符
- SQL Developer 使用问题与解决方法汇总
- 三.Python函数
- Django之Form插件
- 浅谈React Event实现原理
- 2021SC@SDUSC sm2算法原理(1)
- 我国研发出勒索病毒防御软件:能阻止其破坏文件
- 比较简单的单间租房协议!
- 技术:车牌识别摄像机的应用,无人值守洗车房解决方案
- 2022“美亚杯”第八届中国电子数据取证大赛-团队赛题目
- 51单片机向PC端发送字符
- 深睿医疗肺部疾病智能解决方案:针对新冠肺炎辅助诊断的专门研发 | 百万人学AI评选
- EasyCVR前端控制台打印报错“[Vue warn]:Invalid”的解决办法
热门文章
- 详解C++11智能指针
- 子集—leetcode78
- HTML输入学生成绩并排序java_JS实现冒泡排序,插入排序和快速排序并排序输出...
- MongoDB数据库备份与恢复
- 获取控制台窗口的句柄(HWND)和程序中输出回车键
- HDU Problem - 3338 Kakuro Extension (最大流,建图)
- A Simple Math Problem
- red hat linux挂载u盘,请问怎样在Red Hat 9.0中使用U盘?
- hibernate入门总结
- PHP、JS 中 encode/decode