bzoj4237

来源:互联网 发布:知柏地黄丸方歌 编辑:程序博客网 时间:2024/05/29 03:59

按x排序,y分治

然后单调栈随便搞一搞就行辣

#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;typedef long long LL;inline int read(){int x=0;bool f=0;char c=getchar();for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';return f?-x:x;}const int N=200010;int n,ynum[N],stk[N],st=0,stk2[N],st2=0;LL ans=0;struct na{int x,y;}e[N],e1[N],e2[N];inline bool cmp(const na &a,const na &b) {return a.x<b.x;}inline int find(int x) {for (int l=0,r=n+1,mid;;ynum[mid=l+r>>1]<=x?l=mid:r=mid) if (l+1>=r) return l;}inline int cal(int x) {for (int l=0,r=st+1,mid;;e[stk[mid=l+r>>1]].x<=x?l=mid:r=mid) if (l+1>=r) return l;}void solve(int hd,int tl,int l,int r){if (l>=r||hd>=tl) return;int mid=l+r>>1,l1=0,l2=0,lp=hd;for (int i=hd;i<=tl;i++){if (e[i].y<=mid) {while (st&&e[i].y>e[stk[st]].y) st--;stk[++st]=i;e1[++l1]=e[i];}else {ans+=st;while (st2&&e[i].y<e[stk2[st2]].y) st2--;stk2[++st2]=i;if (st2>1) ans-=cal(e[stk2[st2-1]].x);e2[++l2]=e[i];}}st=st2=0;for (int i=1;i<=l1;i++) e[lp++]=e1[i];for (int i=1;i<=l2;i++) e[lp++]=e2[i];solve(hd,hd+l1-1,l,mid);solve(hd+l1,tl,mid+1,r);}int main(){freopen("1.in","r",stdin);freopen("1.out","w",stdout);n=read();for (int i=1;i<=n;i++) e[i].x=read(),e[i].y=ynum[i]=read();sort(ynum+1,ynum+n+1);for (int i=1;i<=n;i++) e[i].y=find(e[i].y);sort(e+1,e+n+1,cmp);solve(1,n,1,n);printf("%lld\n",ans);return 0;}


0 0