[bzoj 4237] 稻草人

探讨了在JOI村的稻草人坐标基础上寻找符合特定条件的矩形田地的数量问题,使用CDQ分治、单调栈及二分搜索算法进行解决。

Description

JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。
有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件:
田地的形状是边平行于坐标轴的长方形;
左下角和右上角各有一个稻草人;
田地的内部(不包括边界)没有稻草人。
给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数

 

Input

第一行一个正整数N,代表稻草人的个数
接下来N行,第i行(1<=i<=N)包含2个由空格分隔的整数Xi和Yi,表示第i个稻草人的坐标

 

Output

输出一行一个正整数,代表遵从启示的田地的个数

 

Sample Input

4
0 0
2 2
3 4
4 3

Sample Output

3

HINT

 

所有满足要求的田地由下图所示:

 

1<=N<=2*10^5

0<=Xi<=10^9(1<=i<=N)

0<=Yi<=10^9(1<=i<=N)

Xi(1<=i<=N)互不相同。

Yi(1<=i<=N)互不相同。
CDQ分治+单调栈+二分搜索
将所有点按y排序,然后将其分成上下两半,考虑左下角的点在下半部分,右上角的点在上部分的矩形有几个
我们将这些点按x值从小到大做,遇到一个右边的点i时,我们需要知道第一个y值比它大的左边的点j是哪个,对此我们可以维护一个y值单调递减的栈,将点i加进来后不断弹出在它前面的y值比它小的点。同时我们要维护下半部分一个y值单调递增的栈(类似单调队列),然后统计上边的栈中有多少个点的x值介于x[j]~x[i]之间。当点i作为矩形的左下角时,这些点便可作为矩形的右上角
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Node
 7 {
 8     int x,y;
 9 }a[200001];
10 int s1[200001],s2[200001];
11 long long ans;
12 int n;
13 bool cmpy(Node a,Node b)
14 {
15     return (a.y<b.y);
16 }
17 bool cmpx(Node a,Node b)
18 {
19     return (a.x<b.x);
20 }
21 void cdq(int l,int r)
22 {int j,i,p,top1=0,top2=0;
23 //cout<<l<<' '<<r<<endl;
24     if (l==r) return;
25     int mid=(l+r)/2;
26     cdq(l,mid);cdq(mid+1,r);
27     sort(a+l,a+mid+1,cmpx);
28     sort(a+mid+1,a+r+1,cmpx);
29     j=l;
30      for (i=mid+1;i<=r;i++)
31      {
32         while (top1&&a[s1[top1]].y>=a[i].y) top1--;
33         s1[++top1]=i;
34         while (a[j].x<a[i].x&&j<=mid)
35         {
36          while (top2&&a[s2[top2]].y<=a[j].y) top2--;
37          s2[++top2]=j;
38           j++;
39         }
40         int ll=1,rr=top2,std=a[s1[top1-1]].x,pos=-1;  
41         //cout<<ll<<' '<<rr<<endl;
42        while(ll<=rr){  
43            int mid=(ll+rr)/2;  
44            if(a[s2[mid]].x>std) pos=mid,rr=mid-1;  
45            else ll=mid+1;  
46        }  
47          //cout<<top2<<' '<<pos<<endl;
48     if (pos!=-1) ans+=top2-pos+1;
49      }
50 }
51 int main()
52 {int i;
53     cin>>n;
54     a[0].x=a[0].y=-1;
55     for (i=1;i<=n;i++)
56     {
57         scanf("%d%d",&a[i].x,&a[i].y);
58     }
59      sort(a+1,a+n+1,cmpy);
60      cdq(1,n);
61     cout<<ans;
62 }

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/7406912.html

在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值