BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap
题意:链接
方法: Treap
解析:
前几道资格赛的题水的不行,这道Gold的题就够分量辣。
首先这个曼哈顿距离啥的肯定能做文章,怎么转化是个问题,自己玩了一会没玩出来,就查了查曼哈顿距离的转化,发现这个玩意转化之后就变得有思路多了,所以这数学本领还是非常重要啊=-=
先看曼哈顿距离的定义
|x1−x2|+|y1−y2|
拆绝对值
x1−x2+y1−y2或x1−x2+y2−y1
x2−x1+y1−y2或x2−x1+y2−y1
即|x1+y1−(x2+y2)|或|x1−y1−(x2−y2)|
设x1+y1为x′,x1−y1为y′
则|x1′−x2′|或|y1′−y2′|
所以原要求1转化为
max(|x1′−x2′|,|y1′−y2′|)<=c
这样的二维的东西显然排序一下降一维。
按x’排序后。维护一个x’的队列,再对y’维护一个平衡树即可了。
至于要求2,即是并查集,也就是说平衡树每一次拿出来前驱后继维护下并查集即可。
y’显然可能反复,又维护并查集我们须要拿出来标号。所以平衡树须要多维护一个no,所以再删除的时候我们要找到v与no都跟要删除的目标节点同样的节点删除。
(前驱写挫WA一次= =!
代码:
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100010
using namespace std;
int fa[N];
int q[N];
int tot;
int root;
int cnt[N];
struct node
{
int l,r,w,v,no,rnd,siz;
}tr[N];
void pushup(int rt)
{
tr[rt].siz=tr[tr[rt].l].siz+tr[tr[rt].r].siz+tr[rt].w;
}
void rturn(int &rt)
{
int t=tr[rt].l;
tr[rt].l=tr[t].r;
tr[t].r=rt;
tr[t].siz=tr[rt].siz;
pushup(rt);
rt=t;
}
void lturn(int &rt)
{
int t=tr[rt].r;
tr[rt].r=tr[t].l;
tr[t].l=rt;
tr[t].siz=tr[rt].siz;
pushup(rt);
rt=t;
}
void insert(int &rt,int v,int no)
{
if(!rt)
{
rt=++tot;
tr[rt].siz=1,tr[rt].no=no,tr[rt].rnd=rand();
tr[rt].v=v,tr[rt].w=1;
return;
}
tr[rt].siz++;
if(v<=tr[rt].v)
{
insert(tr[rt].l,v,no);
if(tr[tr[rt].l].rnd<tr[rt].rnd)rturn(rt);
}else
{
insert(tr[rt].r,v,no);
if(tr[tr[rt].r].rnd<tr[rt].rnd)lturn(rt);
}
}
void del(int &rt,int v,int no)
{
if(!rt)return;
tr[rt].siz--;
if(tr[rt].v==v&&tr[rt].no==no)
{
if(tr[rt].l*tr[rt].r==0){rt=tr[rt].l+tr[rt].r;return;}
else
{
if(tr[tr[rt].l].rnd<tr[tr[rt].r].rnd)
{
rturn(rt);
del(rt,v,no);
}else
{
lturn(rt);
del(rt,v,no);
}
}
}else if(v<tr[rt].v)
{
del(tr[rt].l,v,no);
}else del(tr[rt].r,v,no);
}
int ans;
void q_pre(int rt,int v)
{
if(!rt)return;
if(v>=tr[rt].v)
{
ans=rt;
q_pre(tr[rt].r,v);
}else q_pre(tr[rt].l,v);
}
void q_sub(int rt,int v)
{
if(!rt)return;
if(v<tr[rt].v)
{
ans=rt;
q_sub(tr[rt].l,v);
}else q_sub(tr[rt].r,v);
}
struct point
{
int x,y;
}pt[N];
int n,c;
int find(int x)
{
if(x!=fa[x])return fa[x]=find(fa[x]);
return x;
}
int cmp(point a,point b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
pt[i].x=x+y,pt[i].y=x-y;
fa[i]=i;
}
sort(pt+1,pt+n+1,cmp);
int head=1,tail=0;
for(int i=1;i<=n;i++)
{
while(head<=tail&&pt[i].x-pt[q[head]].x>c)
{
del(root,pt[q[head]].y,q[head]);
head++;
}
ans=0;
q_pre(root,pt[i].y);
int tmp=ans;
if(tmp!=0)
{
if(pt[i].y-tr[tmp].v<=c)
{
if(find(i)!=find(tr[tmp].no))
{
fa[find(i)]=find(tr[tmp].no);
}
}
}
ans=0;
q_sub(root,pt[i].y);
tmp=ans;
if(tmp!=0)
{
if(tr[tmp].v-pt[i].y<=c)
{
if(find(i)!=find(tr[tmp].no))
{
fa[find(i)]=find(tr[tmp].no);
}
}
}
insert(root,pt[i].y,i);
q[++tail]=i;
}
int ma=0,print=0;
for(int i=1;i<=n;i++)
{
int fx=find(i);
if(!cnt[fx])
{
print++;
}
cnt[fx]++;
if(cnt[fx]>ma)ma=cnt[fx];
}
printf("%d %d\n",print,ma);
}
BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap的更多相关文章
- BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
题目 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Time Limit: 5 Sec Memory Limit: 64 MB Description ...
- bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set
Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树
大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数. 曼哈顿生成树的模板题.有关讲解:http://blog.csdn.net/acm_cxlove/article/details/88 ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居【切比雪夫距离+并查集+multiset】
参考:http://hzwer.com/4361.html 坐标开long long,inf开大点 先曼哈顿转切比雪夫(x+y,x-y),距离就变成了max(x',y'): 先按x排序,维护两个指针, ...
- 【BZOJ1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Treap+并查集
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000) ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[算法]并查集+平衡树+数学+扫描线 [题解] 经典曼哈顿距离转切比雪夫距离. 曼哈顿距离:S=|x1-x2|+|y1-y2|<=c 即:max(x1-x2+y1-y2,x1-x2-y1+y2, ...
随机推荐
- [洛谷P3932]浮游大陆的68号岛
题目大意:有一行物品,每两个物品之间有一个距离.每个物品有一个价值.现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值. 把物品a搬到物品b处的价值为物品a的价值乘a到b的距离 ...
- Haproxy实现web的页面的动静分离
一.Haproxy概述: 概述:Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,由C语言编写而成,支持会话保持.七层处理.健康检查.故障修复后自动加载.动静分离.HAProxy ...
- shiro整合thymeleaf
1.引入依赖 <!--thymeleaf中使用shiro--> <dependency> <groupId>com.github.theborakompanioni ...
- ArcGIS api for javascript——设置可见的比例
描述 ArcGIS JavaScript API的1.2版本加入更多地图如何缓存,切片和地图服务的控制.本例展示了如何限制地图能够接收切片的比例等级.如果不想用户过分的放大或缩小,即使切片存在这些极端 ...
- 开源企业IM-免费企业即时通讯-ENTBOOST V0.9版本号公布
ENTBOOST V0.9版本号公布,更新内容:1.完好多人群组聊天,提高群组聊天性能及稳定性:2.苹果IOS SDK.添加联系人管理功能,优化API和内部流程.修复部分BUG.3.添加企业应用功能集 ...
- 面对即将终止支持的server你还能做些什么
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXF1c2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- Protocol Buffers的基础说明和使用
我们開始须要使用protobuf的原因是,在处理OJ的contest模块的时候,碰到一个问题就是生成contestRank的时候.须要存储非常多信息. 假设我们採用model存储的话,那么一方面兴许假 ...
- Sql Server通用分页存储过程
Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 ...
- springmvc使用jQuery.datatable时遇到的错误
springmvc使用jQuery.datatable时遇到的错误 1正确时返回 josn结果: {,,,,,,,,,,,,,,,,"} 页面显示处理中(processing),列表空白,其 ...
- mescroll报错
1.Cannot read property 'insertBefore' of null:说明你的容器id未找到,应确认你的容器id名与你NEW的容器名一致: