JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。
有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件:
田地的形状是边平行于坐标轴的长方形;
左下角和右上角各有一个稻草人;
田地的内部(不包括边界)没有稻草人。
给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数
标签:cpp idt 两种 std 它的 hellip 多少 整数 algorithm
Time Limit: 40 Sec Memory Limit: 256 MB
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #define LL long long int #define dob double using namespace std; const int N = 200010; int n,m,tot1,tot2;LL Ans; struct Data{ int x,y; bool operator <(const Data &i)const{ return y<i.y; } }scr[N],st1[N],st2[N],t[N]; inline int gi(){ int x=0,res=1;char ch=getchar(); while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)res*=-1;ch=getchar();} while(ch<=‘9‘&&ch>=‘0‘)x=x*10+ch-48,ch=getchar(); return x*res; } /* CDQ按上下(y)分治。传下去时y有序,传上去时x有序。 枚举上半部分的点,求它的贡献? 1.考虑上半部分的限制 这个点受左边y坐标小于它的点约束,且只考虑往左边第一个点x‘就可以了。 因为你要越中线。过了x‘就是不合法。 找到左边第一个y小于它的点 -> 单调栈。 在上半部分维护一个y递增的单调栈即可。 2.考虑下半部分的限制 下半部分的点合法,它在y以内的右上角一定没有点。 画出合法曲线,发现它的y是单调递减的。 随便维护一个单调递减,找的时候二分/lower_bound一下就好。 上下要一起枚举一起加点,因为"在y以内的右上角"。 */ inline void insert1(Data Is){//下半部分,单调递减栈 while(tot1 && st1[tot1]<Is)tot1--; st1[++tot1]=Is; } inline void insert2(Data Is){ while(tot2 && Is<st2[tot2])tot2--; st2[++tot2]=Is; } //二分找下半部分x比nx大的点数 inline int getl(int nx){ int l=1,r=tot1,ans=r+1; while(l<=r){ int mid=(l+r)>>1; if(st1[mid].x>nx)ans=mid,r=mid-1; else l=mid+1; } return ans; } inline int calc(Data Is){ insert2(Is); if(tot2==1)return tot1; if(!tot1)return 0; Data Ls=st2[tot2-1]; int l=getl(Ls.x); return tot1-l+1; } inline void CDQ(int l,int r){ if(l==r)return; int mid=(l+r)>>1; CDQ(l,mid);CDQ(mid+1,r); int i=l,j=mid+1,k=l; tot1=0;tot2=0; while(i<=mid && j<=r){ if(scr[i].x<scr[j].x){ insert1(scr[i]); t[k++]=scr[i++]; } else{ Ans+=calc(scr[j]); t[k++]=scr[j++]; } } while(i<=mid)t[k++]=scr[i++]; while(j<=r){ Ans+=calc(scr[j]); t[k++]=scr[j++]; } for(k=l;k<=r;++k)scr[k]=t[k]; } int main() { n=gi(); for(int i=1;i<=n;++i){ scr[i].x=gi();scr[i].y=gi(); } sort(scr+1,scr+n+1); CDQ(1,n); printf("%lld\n",Ans); return 0; }
标签:cpp idt 两种 std 它的 hellip 多少 整数 algorithm
原文地址:http://www.cnblogs.com/fenghaoran/p/7420620.html