$bzoj4237$稻草人 $cdq$分治
正解:$cdq$分治
解题报告:
$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 ;
}
随机推荐
- Vue.js 第2章 钩子函数&自定义指令&过滤器&计算属性&侦听器
目标 钩子函数 自定义指令 自定义过滤器 计算属性 监听属性 局部自定义指令 为什么需要自定义指令 为了复用,为了代码的灵活 指令的分类:全局指令,局部指令 在vm外面创建的指令 通过Vue.dire ...
- 是readdir,还是readdir_r
readdir的原型如下: struct dirent *readdir(DIR *dirp); 因为内部使用了静态数据,所以readdir被认为不是线程安全的函数,POSIX[i]标准这样描述: T ...
- shell去掉最后一个字符
实测过第一种写法,可正常删除 sed 's/.$//' awk '{sub(/.$/,"")}1' awk '{printf $0"\b \n"}' ufile ...
- 在ThinkPHP中,if标签和比较标签对于变量的比较。
在TP模板语言中.if和eq都可以用于变量的比较. <比较标签 name="变量" value="值">内容</比较标签> 比如: &l ...
- C# POST 表单发送文件
表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...
- js原生继承几种方式
js原生继承 js本身并没有继承和类的概念,本质上是通过原型链(prototype)的形式实现的. 1.先写两个构造函数Parent和Child,用于将Child继承Parent function P ...
- 通过PdfiumViewer.dll实现pdf直接从流显示(效果不好)
开源的PdfiumViewer.dll并不完整 需要不开源的pdfium.dll配合使用 引用只需添加PdfiumViewer.dll,但pdfium.dll必须跟它放在一个路径下 界面中添加控件: ...
- PyTorch里面的torch.nn.Parameter()
在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...
- [转]【Linux】Linux 目录结构
初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...
- [转]C#操作word模板插入文字、图片及表格详细步骤
c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.W ...