[ CDQ分治 ] BZOJ4237
来源:互联网 发布:淘宝卖家流量钱包充值 编辑:程序博客网 时间:2024/06/04 00:22
先将坐标按
将两个区间分别按
枚举左区间的点
考虑为什么可以这样做。
对于右区间中的点
对于左区间中的
#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline void Read(int& x){ char c=nc(); for(;c<'0'||c>'9';c=nc()); for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());}#define N 200010#define ll long long#define ab pair<int,int>#define x first#define y secondab a[N],b[N],c[N],t[N];int i,j,k,n,m,p,l1,l2,p1,p2;ll Ans;inline void Add(ab x){ while(l2&&c[l2].x>x.x)l2--; c[++l2]=x;}inline int Get(int x){ int l=1,r=l2; while(l<=r){ int Mid=l+r>>1; if(c[Mid].y>x)l=Mid+1;else r=Mid-1; } return r;}inline void Solve(int l,int r){ if(l==r)return; int Mid=l+r>>1; Solve(l,Mid);Solve(Mid+1,r); l1=l2=0; int j=Mid; for(int i=l;i<=Mid;i++){ while(j<r&&a[j+1].y>a[i].y)Add(a[++j]); while(l1&&b[l1].x<a[i].x)l1--; Ans+=l2-(l1?Get(b[l1].y):0);b[++l1]=a[i]; } int p1=l,p2=Mid+1,p=l; while(p1<=Mid||p2<=r) if(p1<=Mid&&(p2>r||a[p1].y>a[p2].y))t[p++]=a[p1++];else t[p++]=a[p2++]; for(int i=l;i<=r;i++)a[i]=t[i];}int main(){ Read(n); for(i=1;i<=n;i++)Read(a[i].x),Read(a[i].y); sort(a+1,a+n+1); Solve(1,n); cout<<Ans<<endl; return 0;}
阅读全文
1 0
- [ CDQ分治 ] BZOJ4237
- bzoj4237稻草人 cdq分治+栈
- BZOJ4237(cdq分治+单调栈)
- [BZOJ4237]稻草人(cdq分治+单调栈+二分)
- BZOJ4237:稻草人 (CDQ分治+二分+单调栈)
- 【bzoj4237】【分治】稻草人
- 【分治计数】BZOJ4237 稻草人
- cdq分治
- cdq分治
- cdq分治
- cdq分治
- bzoj4237
- 时间分治(cdq分治)
- 学习笔记: cdq分治
- bsoj2653 cdq分治
- 【CDQ分治】数据
- BZOJ3262【CDQ分治】
- BZOJ1492【CDQ分治】
- 在IDEA中实战Git
- Linux shell 重定向
- [LeetCode]Maximum Length of Repeated Subarray
- C语言——文件操作
- c++注释
- [ CDQ分治 ] BZOJ4237
- sql语句的证删改查的sql语句
- MySQL导出performance_schema
- macOS 配置 Java 和 Hadoop
- MyEclipse中运行tomcat报Confirm Perspective Switch
- u-net segnet 学习笔记
- CS 400 Tournament Swaps 循环赛,完全二叉树.
- Android中的Service组件(一)
- 【SG函数】HDU1847[Good Luck in CET-4 Everybody!]题解