自己做网站宣传产品,企业网站的建立要做的准备,网站建设时间安排表,广州城中村正题
题目链接:https://loj.ac/problem/2880 题目大意
给出平面上的nnn个点#xff0c;然后求有多少个矩形满足
左下角和右上角各有一个点矩形之间没有其他点 1≤n≤2105,1≤xi,yi≤109,1\leq n\leq 2\times 10^5,1\leq x_i,y_i\leq 10^9,1≤n≤2105,1≤xi,yi≤109,保证…正题
题目链接:https://loj.ac/problem/2880 题目大意
给出平面上的nnn个点然后求有多少个矩形满足
左下角和右上角各有一个点矩形之间没有其他点
1≤n≤2×105,1≤xi,yi≤109,1\leq n\leq 2\times 10^5,1\leq x_i,y_i\leq 10^9,1≤n≤2×105,1≤xi,yi≤109,保证xi,yix_i,y_ixi,yi分别不重复出现。 解题思路
按照xxx排序考虑CDQCDQCDQ分治后左边对右边的影响对yyy从大到小排序然后左右各自维护一个单调栈左边考虑每个点第一个右上角的点右边维护一个yyy轴递减xxx轴递增的单调栈然后再右边的单调栈上二分出左边的合法位置即可。
时间复杂度O(nlog2n)O(n\log^2 n)O(nlog2n) code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N2e510;
struct node{int x,y;
}p[N];
int n,s[N],t[N];
long long ans;
bool cmp(node x,node y){return x.xy.x;}
bool cMp(node x,node y){return x.yy.y;}
void CDQ(int l,int r){if(lr)return;int mid(lr)1;CDQ(l,mid);CDQ(mid1,r);sort(pl,pmid1,cMp);sort(pmid1,pr1,cMp);int zmid1,top0,toq0;for(int il;imid;i){while(zrp[z].yp[i].y){while(top0p[z].xp[s[top]].x)top--;s[top]z;z;}while(toq0p[i].xp[t[toq]].x)toq--;if(toq){int L1,Rtop;while(LR){int mid(LR)1;if(p[s[mid]].yp[t[toq]].y)Lmid1;else Rmid-1;}anstop-L1;}else anstop;t[toq]i;}return;
}
int main()
{scanf(%d,n);for(int i1;in;i)scanf(%d%d,p[i].x,p[i].y);sort(p1,p1n,cmp);CDQ(1,n);printf(%lld\n,ans);return 0;
}