BZOJ1935 园丁的烦恼
一个二维偏序的问题,学过了三维偏序cdq分治之后觉得这个题非常的水。只需按一维排序之后再用树状数组操作即可。——by VANE
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+;
struct qry
{
int x,y,id;
}q[N<<];
struct tree
{
int x,y;
}t[N];
int s[N*],n,m,tmp[N*],num,vis_tim,ans[N*];
bool cmp(qry a,qry b)
{
return a.x<b.x;
}
bool cmpp(tree a,tree b)
{
return a.x<b.x;
}
void add(int x)
{
for(;x<=num;x+=x&-x)
s[x]++;
}
int query(int x)
{
int res=;
for(;x;x-=x&-x)
res+=s[x];
return res;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
scanf("%d%d",&t[i].x,&t[i].y);
for(int i=;i<=m;++i)
{
int x,y,xx,yy;scanf("%d%d%d%d",&x,&y,&xx,&yy);
int pos=(i-)*;
q[pos+].x=xx;q[pos+].y=yy;q[pos+].id=pos+;
q[pos+].x=x-;q[pos+].y=y-;q[pos+].id=pos+;
q[pos+].x=xx;q[pos+].y=y-;q[pos+].id=pos+;
q[pos+].x=x-;q[pos+].y=yy;q[pos+].id=pos+;
}
for(int i=;i<=n;++i)
tmp[i]=t[i].y;
for(int i=;i<=m*;++i)
tmp[i+n]=q[i].y;
sort(tmp+,tmp++n+m*);
num=unique(tmp+,tmp++n+*m)-tmp-;
for(int i=;i<=n;++i) t[i].y=lower_bound(tmp+,tmp++num,t[i].y)-tmp;
for(int i=;i<=m*;++i) q[i].y=lower_bound(tmp+,tmp++num,q[i].y)-tmp;
sort(q+,q++*m,cmp);
sort(t+,t++n,cmpp);
int i=,j=;
while(j<=*m)
{
int h=q[j].x;
while(t[i].x<=h&&i<=n) add(t[i].y),++i;
while(j<=*m&&q[j].x==h)
{
ans[q[j].id]+=query(q[j].y);
++j;
}
}
for(int i=;i<=*m;i+=)
printf("%d\n",ans[i]+ans[i+]-ans[i+]-ans[i+]);
}
二维偏序用cdq我是不是有病,我就是要写cdq 15000ms卡过去了
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,w,id,f;
bool operator <(const node &b)const
{
return x==b.x?y<b.y:x<b.x;
}
}q[];
int cnt,maxr,tim;
int t[],v[],ans[],pos[];
inline int lowbit(int x){return x&(-x);}
void add(int x,int w)
{
for(;x<=maxr;x+=lowbit(x))
{
if(v[x]!=tim)
{
v[x]=tim;t[x]=w;
}
else t[x]+=w;
}
}
int query(int x)
{
int an=;
for(;x;x-=lowbit(x))
if(v[x]==tim)
an+=t[x];
return an;
}
void cdq(int l,int r)
{
if(l==r)return;
int mid=(l+r)>>;
cdq(l,mid);cdq(mid+,r);
sort(q+l,q+mid+);sort(q+mid+,q+r+);
tim++;
int i=l,j=mid+;
while(j<=r)
{
while(q[i].f==&&i<=mid)++i;
while(q[j].f==&&j<=r)++j;
if(q[i].x<=q[j].x&&i<=mid)add(q[i].y,q[i].w),++i;
else if(j<=r)ans[q[j].id]+=query(q[j].y),++j;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
int x,y;
scanf("%d%d",&x,&y);x++;y++;
q[++cnt].f=;q[cnt].x=x;q[cnt].y=y;q[cnt].w=;q[cnt].id=cnt;maxr=max(maxr,y);
}
for(int i=;i<=m;++i)
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);x1++;x2++;y1++;y2++;
pos[i]=cnt;maxr=max(maxr,max(y1,y2));
q[++cnt].f=;q[cnt].x=x2;q[cnt].y=y2;q[cnt].id=cnt;
q[++cnt].f=;q[cnt].x=x1-;q[cnt].y=y1-;q[cnt].id=cnt;
q[++cnt].f=;q[cnt].x=x1-;q[cnt].y=y2;q[cnt].id=cnt;
q[++cnt].f=;q[cnt].x=x2;q[cnt].y=y1-;q[cnt].id=cnt;
}
cdq(,cnt);
for(int i=;i<=m;++i)
printf("%d\n",ans[pos[i]+]+ans[pos[i]+]-ans[pos[i]+]-ans[pos[i]+]);
return ;
}
BZOJ1935 园丁的烦恼的更多相关文章
- [bzoj1935][Shoi2007]Tree 园丁的烦恼 _树状数组
Tree 园丁的烦恼 bzoj-1935 Shoi-2007 题目大意:给定平面上的$n$个点,$m$次查询矩形点个数. 注释:$1\le n,m\le 5\cdot 10^5$. 想法:静态二维数点 ...
- bzoj1935 [Shoi2007]园丁的烦恼
bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10 ...
- [bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 980 Solved: 450[Submit][ ...
- BZOJ1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 552 Solved: 220[Submit][ ...
- bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼
http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 +CDQ分治
1935: [Shoi2007]Tree 园丁的烦恼 参考与学习:https://www.cnblogs.com/mlystdcall/p/6219421.html 题意 在一个二维平面中有n颗树,有 ...
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )
假如矩阵范围小一点就可以直接用二维树状数组维护. 这道题, 差分答案, 然后一维排序, 另一维离散化然后树状数组维护就OK了. ----------------------------------- ...
- 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 648 Solved: 273[Submit][ ...
- bzoj1382 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 1261 Solved: 578[Submit] ...
随机推荐
- 【洛谷 P4360】 [CEOI2004]锯木厂选址(斜率优化)
题目链接 一开始我的\(dp\)方程列错了,其实也不能说列错了,毕竟我交上去还是把暴力的分都拿到了,只是和题解的不一样,然后搞半天没搞出来去看题解,又看不懂,对不上,原来状态设置不一样自闭了. \(f ...
- css3同心圆闪烁扩散效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 2017ACM暑期多校联合训练 - Team 2 1011 HDU 6055 Regular polygon (数学规律)
题目链接 **Problem Description On a two-dimensional plane, give you n integer points. Your task is to fi ...
- 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)
题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...
- Master of Phi (欧拉函数 + 积性函数的性质 + 狄利克雷卷积)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6265 题目大意:首先T是测试组数,n代表当前这个数的因子的种类,然后接下来的p和q,代表当前这个数的因 ...
- 强连通图(最多加入几条边使得图仍为非强连通图)G - Strongly connected HDU - 4635
题目链接:https://cn.vjudge.net/contest/67418#problem/G 具体思路:首先用tarjan缩点,这个时候就会有很多个缩点,然后再选取一个含有点数最少,并且当前这 ...
- 移动端测试===adb shell top命令解释
adb shell top top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序. top 用法 >a ...
- netif_start_queue/netif_wake_queue/netif_stop_queue
在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息. 主要有4个: 1]netif_start_queue 启动接口传输队列 2]netif_wake ...
- 分布式系统的负载均衡以及ngnix负载均衡的五种策略
一般而言,有以下几种常见的负载均衡策略: 一.轮询. 特点:给每个请求标记一个序号,然后将请求依次派发到服务器节点中,适用于集群中各个节点提供服务能力等同且无状态的场景. 缺点:该策略将节点视为等同, ...
- Machine Learning系列--CRF条件随机场总结
根据<统计学习方法>一书中的描述,条件随机场(conditional random field, CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出 ...