我是萌萌的传送门

题意不难理解吧……

一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着……(好吧我已经忘了……)然而我第一眼看完题之后的思路是数据结构直接搞,本着“我就不信这个邪了”的念头,就搞出了这么一个树状数组套平衡树维护斜线的奇葩写法。

话说lrd说这题卡常,然而限时40s,我23.8s并没有什么压力,不过运行速度倒数也是感人肺腑……

(我后面就这么几个了……数据结构果然比不上CDQ……QAQ)

言归正传。

如果不用分治的话就需要按照x或者y扫描所有点,并依次处理当前点与之前的点形成的贡献和更新数据结构。

显然对于每个点,对它有贡献的点只能是在它左下角且它的右上角没有其他点的点,如图:

把这些点用线段连起来,可以得到一条斜率始终为负的斜线。如果按照y坐标从小到大处理的话,就可以以y坐标为关键字建立平衡树维护斜线。

每次查询都是前缀查询,直接在平衡树中查询即可。但是会发现一些反例,例如:

如果先插入红点的话,按照定义应该把斜线清空,只留下红点,然后查询绿点的时候就会WA。

这说明,每插入一个新点就会破坏斜线。也就是说,我们在询问的时候必须只考虑x坐标在当前点左边的点,因为按照y递增处理,只能用一个数据结构维护x。考虑到每个询问都是前缀询问,可以对x离散化后用树状数组维护x坐标,再用平衡树维护位于对应区间内的斜线即可。

查询和更新应该不难想,贴两个图跑算了。

懒得写Treap了,所以用了pb_ds……如果Treap的话还要手写删除所有键值>x的数,有空再说……

 /**************************************************************
Problem: 4237
User: hzoier
Language: C++
Result: Accepted
Time:23888 ms
Memory:70456 kb
****************************************************************/ #include<cstdio>
#include<cstring>
#include<algorithm>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<int,int,less<int>,rb_tree_tag,tree_order_statistics_node_update>rbtree;
const int maxn=;
struct A{
int x,y;
bool operator<(const A &a)const{return y<a.y;}
}a[maxn];
void add(int,int);
int query(int);
int n,b[maxn];
long long ans=;
rbtree T[maxn];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
b[i]=a[i].x;
}
sort(b+,b+n+);
for(int i=;i<=n;i++)a[i].x=lower_bound(b+,b+n+,a[i].x)-b;
sort(a+,a+n+);
for(int i=;i<=n;i++){
ans+=query(a[i].x);
add(a[i].x,a[i].y);
}
printf("%lld",ans);
return ;
}
void add(int x,int y){
for(int i=x;i<=n;i+=i&-i){
rbtree::reverse_iterator it=T[i].rbegin();
while(it!=T[i].rend()&&it->second<x){
rbtree::reverse_iterator iter=++it;
T[i].erase(--it);
it=iter;
}
T[i][y]=x;
}
}
int query(int x){
int ans=,y=-;
while(x){
ans+=T[x].size()-T[x].order_of_key(y);
if(!T[x].empty())y=max(y,T[x].rbegin()->first);
x&=x-;
}
return ans;
}

话说这题是一边听教练放歌一边写的,结果费了两节课,这种简单题写这么久,身败名裂……

bzoj4237 稻草人的更多相关文章

  1. bzoj4237: 稻草人 cdq分治 单调栈

    目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...

  2. [BZOJ4237]稻草人/[JOISC2014]かかし

    [BZOJ4237]稻草人/[JOISC2014]かかし 题目大意: 平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不 ...

  3. BZOJ4237 稻草人 分治 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...

  4. [BZOJ4237]稻草人(CDQ分治)

    先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐 ...

  5. BZOJ4237 稻草人 【CDQ分治】

    Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...

  6. BZOJ4237 稻草人(分治+树状数组+单调栈)

    如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...

  7. BZOJ4237稻草人——单调栈+CDQ分治

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

  8. bzoj4237稻草人

    题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...

  9. bzoj4237 稻草人——分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...

随机推荐

  1. D3D三层Texture纹理经像素着色器实现渲染YUV420P

    简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...

  2. 较为完整的meta

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [转]Excel导入异常Cannot get a text value from a numeric cell解决

    原文地址:http://blog.csdn.net/ysughw/article/details/9288307 POI操作Excel时偶尔会出现Cannot get a text value fro ...

  4. HDF5基本使用方法

    HDF5, 大量(海量?)数据存储的一种解决方案. HDF的全称是Hiearchical Data Format, 5是版本号(未考证过TODO). 一个HDF5文件操作起来就像一个独立的文件系统. ...

  5. Azure IaaS限制

    每个云服务最多运行 50 个虚机 每个云服务最多有 150 个输入 endpoints

  6. 一些常用的git指令

    PyCharm编辑器 如何切换分支 git branch 查看当前在哪个分支,也会显示本地所有的分支名 git branch dev-chenqiao 新建分支 git checkout dev-ch ...

  7. css-css权威指南学习笔记8

    第十二章 列表与生成内容 1.list-style-type:cjk-ideographic生成一二三四的序号 2.不管是ul还是ol,list-style-type无法识别的值都应用为decimal ...

  8. Docker 学习之命令详解

    1. docker version docker version 显示 Docker 版本信息. 2. docker info docker info 显示 Docker 系统信息,包括镜像和容器数. ...

  9. Linux服务器配置多台虚拟主机

    2016年11月4日15:59:12 LAMP环境 参考:http://blog.itblood.com/nginx-same-ip-multi-domain-configuration.html 在 ...

  10. POJ1742Coins(并不理解是什么意思)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 32309   Accepted: 10986 Descripti ...