BZOJ4237 稻草人(分治+树状数组+单调栈)
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了。可以想到用分治来制造单调性。
按横坐标排序,每次考虑跨过分治中心的矩形。考虑右边的每个点能与左边的哪些点构成矩形。首先这受到右边点的限制,对于每个点用set求出这个范围。然后对所有点按纵坐标从大到小排序,维护一个树状数组,如果是右边的点直接在树状数组上的该范围查询,左边的点则将其加入单调栈并在树状数组上修改。
常数过大,在darkbzoj上跑了30s,bzoj上T掉了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 200010
#define inf 1000000000
int n,stk[N],b[N],tree[N];
long long ans=;
struct data{int x,y,d;
}a[N];
set<int> f;
bool cmp(const data&a,const data&b)
{
return a.x<b.x;
}
bool cmp1(const data&a,const data&b)
{
return a.y>b.y;
}
void add(int k,int x){while (k<=n+) tree[k]+=x,k+=k&-k;}
int query(int k){int s=;while (k) s+=tree[k],k-=k&-k;return s;}
void solve(int l,int r)
{
if (l==r) return;
int mid=l+r>>;
solve(l,mid);
solve(mid+,r);
for (int i=mid+;i<=r;i++)
a[i].d=*f.lower_bound(a[i].y),f.insert(a[i].y);
for (int i=mid+;i<=r;i++) f.erase(a[i].y);
sort(a+l,a+mid+,cmp1);
sort(a+mid+,a+r+,cmp1);
int x=l-,top=;
for (int i=mid+;i<=r;i++)
{
while (x<mid&&a[x+].y>a[i].y)
{
x++;
while (top&&a[x].x>a[stk[top]].x) add(a[stk[top]].y,-),top--;
stk[++top]=x;add(a[x].y,);
}
ans+=query(a[i].d)-query(a[i].y);
}
x=l-,top=;
for (int i=mid+;i<=r;i++)
{
while (x<mid&&a[x+].y>a[i].y)
{
x++;
while (top&&a[x].x>a[stk[top]].x) add(a[stk[top]].y,),top--;
stk[++top]=x;add(a[x].y,-);
}
}
sort(a+l,a+mid+,cmp);
sort(a+mid+,a+r+,cmp);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4237.in","r",stdin);
freopen("bzoj4237.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i].x=read(),b[i]=a[i].y=inf-read();
sort(b+,b+n+);
for (int i=;i<=n;i++) a[i].y=lower_bound(b+,b+n+,a[i].y)-b;
sort(a+,a+n+,cmp);f.insert(n+);
solve(,n);
cout<<ans;
return ;
}
BZOJ4237 稻草人(分治+树状数组+单调栈)的更多相关文章
- Bzoj4237 cdq分治+树状数组+单调栈
二维平面在某区域内点的问题,要么树套树,kdtree,要么就是cdq分治了.然而这题树套树和kdtree都不是很好搞的样子,于是我们就只能cdq分治了.首先把点按照横坐标x排序,在每一层我们需要算出右 ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组
BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...
- BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...
- BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组
BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description 给定N个数对(xi, yi),求最长上升子 ...
随机推荐
- P1488 肥猫的游戏
题目描述 野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数学问题也就不足为奇了.一次,野猫遇到了一道有趣的几何游戏题目,便拿给胖子看.游戏要求在一个有n个顶点凸多边 ...
- beego 点滴
在使用beego时遇到 need a primary key field 1 确保结构中的 字段首字母大写 2 beego默认主键是id 如果主键定义的是其他字段比如userid 那么加上orm pk ...
- 「Python」Convert map object to numpy array in python 3
转自Stackoverflow.备忘用. Question In Python 2 I could do the following: import numpy as np f = lambda x: ...
- RabbitMQ基础教程之使用进阶篇
RabbitMQ基础教程之使用进阶篇 相关博文,推荐查看: RabbitMq基础教程之安装与测试 RabbitMq基础教程之基本概念 RabbitMQ基础教程之基本使用篇 I. 背景 前一篇基本使用篇 ...
- 【转】cocos2dx3.2学习笔记之Director(导演类)
转载:https://blog.csdn.net/u013435551/article/details/38579747 在Cocos2d-x中,把统筹游戏大局的类抽象为导演类(Director),D ...
- unity初探之黑暗之光(2)
unity初探之黑暗之光(2) 一.设置角色跟随鼠标点击移动 思路:使用charactercollider的SimpleMove方法来控制角色的移动.通过摄像机的射线投射到地面,通过屏幕上的一个点也就 ...
- Siki_Unity_1-4_C#编程(零基础)
1-4 C#编程(零基础) 任务1:第一章课程资料 任务2:简介 任务3:安装设置IDE工具 Unity内置IDE:MonoDevelop 推荐Visual Studio 下载/安装 VS Commu ...
- python作业:三级菜单(第一周)
一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二.三级菜单 ...
- 五:ResourceManager High Availability RM 高可用
RM有单点失败的风险,但是可以做HA. RMs HA通过master/standby这种结构实现,一个master是active的,其它standby是inactive的.可能通过命令行切换主备节点 ...
- 《Linux编程大作业》
一.要求 作业题目 Linux下的多进程/线程网络通信 作业目标 要求学生熟练掌握<Linux编程>课程中的知识点,包括Linux常用命令.bash脚本.编译和调试环境.读写文件.进程间通 ...