固定一维c,然后(a,b)看成坐标,矩形区域求交
1.Segment tree Beats!
2.改成不合法的区域就是求并,c反向枚举,区域只增不减且完全包含之前的
单调栈预处理找到轮廓线,然后两个指针维护顶头位置即可
#include#define reg register int#define il inline#define int long long#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=500000+5;int n,A,B,C;ll ans,sum;struct node{ int a,b,c;}p[N];bool cmpa(node a,node b){ return a.a b.c;}int sta[N],top;int x[N],y[N];int main(){ rd(n);rd(A);rd(B);rd(C); for(reg i=1;i<=n;++i) rd(p[i].a),rd(p[i].b),rd(p[i].c); sort(p+1,p+n+1,cmpa); for(reg i=1;i<=n;++i){ while(top&&p[sta[top]].b p[sta[i+1]].b;--j) y[j]=p[sta[i]].a; }// for(reg i=1;i<=A;++i){// cout< <<" ";// }cout< =1;--i){ // cout<<" i "< <<" tx "< <<" ty "< < =i){ // cout<<" p[j] "< <<" "< <
很套路了
排序,然后偏序想到坐标矩形求面积
交和并的转化,容斥。或者大力吉司机线段树