正解:$cdq$分治

解题报告:

传送门$QwQ$

$umm$总感觉做过这题的亚子,,,?

先把坐标离散化,然后把所有点先按$x$排序$QwQ$,然后用类似平面最近点对的方法,先分别解决$mid$两侧的,然后现在就只要考虑两个端点分别在两侧的点了$QwQ$

考虑枚举右上的点然后计算左下有多少个点满足条件?

首先对于左下的点,由条件二可得显然是要维护一个横坐标单增纵坐标单减的单调栈

然后对于右上的点$(x_i,y_i)$,发现就找到满足$y\leq y_i,x\leq x_i$的点的$y_{max}$,然后在左侧的单调栈中二分找到所有满足$y\geq y_{max}$的点,计入答案就成$QwQ$

然后发现这个找$y_max$的也可以用单调栈维护?就维护一个横坐标单增纵坐标单增的单调栈昂$QwQ$

然后就做完辣?$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define fy(i) edge[i].fy
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define lb(x) lower_bound(st+1,st+1+n,x)-st
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=2e5+;
int n,st[N];
ll as;
struct node{int x,y;}nod[N],t1[N],t2[N],stck1[N],stck2[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(node gd,node gs){return gd.x<gs.x;}
il int fd(ri dat,ri lim)
{
ri l=,r=lim;
while(l<r){ri mid=(l+r)>>;if(stck1[mid+].y>dat)r=mid;else l=mid+;}
return r;
}
void solv(ri l,ri r)
{
if(l==r)return;ri mid=(l+r)>>;solv(l,mid);solv(mid+,r);
int num1=,num2=,top1=,top2=,i=l,j=mid+;
for(j=mid+;j<=r;++j)
{
t2[++num2]=nod[j];
while(i<=mid && nod[i].y<nod[j].y)
{
t1[++num1]=nod[i];
while(top1 && stck1[top1].x<nod[i].x)--top1;
stck1[++top1]=nod[i];++i;
}
while(top2 && stck2[top2].x>nod[j].x)--top2;
stck2[++top2]=nod[j];
as+=top1-fd(stck2[top2-].y,top1);
}
while(i<=mid)t1[++num1]=nod[i++];
i=,j=;ri nw=l-;
while(i<=num1 && j<=num2)if(t1[i].y<t2[j].y)nod[++nw]=t1[i++];else nod[++nw]=t2[j++];
while(i<=num1)nod[++nw]=t1[i++];
while(j<=num2)nod[++nw]=t2[j++];
} int main()
{
freopen("4237.in","r",stdin);freopen("4237.out","w",stdout);
n=read();rp(i,,n)nod[i]=(node){read()+,st[i]=read()+};
sort(st+,st++n);rp(i,,n)nod[i].y=lb(nod[i].y);sort(nod+,nod++n,cmp);rp(i,,n)nod[i].x=i;
solv(,n);printf("%lld",as);
return ;
}

随机推荐

  1. 阿里靠什么支撑 EB 级计算力?

    作者 关涛 阿里云智能事业群 研究员 导读:MaxCompute 是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务.去年MaxCompute 做了哪些工 ...

  2. 删除username的索引

    -- 删除index_name 索引 drop index index_name on user; show index from user \G; -- 创建新索引列组成,index_pinyin为 ...

  3. @雅礼集训01/10 - T1@ matrix

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个矩阵.求它的所有子矩阵中本质不同的行的个数之和. inp ...

  4. 模板—v-dcc缩点

    int dfn[MAXN],low[MAXN],num,root; int stack[MAXN],top,cnt; bool iscut[MAXN]; int new_id[MAXN],c[MAXN ...

  5. url地址栏参数<==>对象(将对象转换成地址栏的参数以及将地址栏的参数转换为对象)的实用函数

    /** * @author web得胜 * @param {Object} obj 需要拼接的参数对象 * @return {String} * */ function obj2qs(obj) { i ...

  6. jasperReports 通过java导出各种格式报表,及javaweb项目整合显示各种报表

    注意:编写此项目时,请先手动编写**.jrxml  或者用IReport生成**.jrxml或**.jasper 注:java导出报表与web项目显示报表方法其实是相同的,只不过有一句代码不同,如下 ...

  7. 用户注册页的布局及js逻辑实现(正则,注册按钮)

    文章地址:https://www.cnblogs.com/sandraryan/ 先写一个简单的静态页面,然后对用户输入的内容进行验证,判断输入的值是否符合规则,符合规则进行注册 先上静态页面 < ...

  8. 各种浏览器怎么换ip

    https://jingyan.baidu.com/article/e4d08ffdb784050fd2f60ddd.html 方法/步骤   1 用浏览器搜索ip,得到自己当前的ip. 2 用浏览器 ...

  9. Educational Codeforces Round 10 A B题、

    A. Gabriel and Caterpillar 题意: 就是说  一个小孩子去观察毛毛虫从 h1的地方爬到h2的地方.毛毛虫从10点爬到22点.每小时爬的距离是a, 晚上22点到第二天早上10点 ...

  10. 洛谷P2672 推销员 题解 贪心

    题目链接:https://www.luogu.org/problem/P2672 这道题目是贪心,贪心的思想是: 选择 \(m\) 户人家的最大疲劳值应该是以下两种方案中的较大值: 方案一:选择 \( ...