$O(nlogn)$
直接使用线段树维护y轴就可以,代码不同与y总 各有优劣
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+100;
struct Segment
{
int x , y1 , y2 , k;
bool operator <(const Segment a)
{
return x < a.x;
}
} seg[maxn];
int n , m , ans ,tree[ 4 * maxn] , lazy[ 4 * maxn];
void pushup(int u, int l ,int r)
{
if (lazy[u] > 0) tree[u] = r - l + 1;
else if (l == r) tree[u]= 0;
else tree[u] = tree[u << 1] + tree[u << 1 | 1];
}
void change( int p , int l ,int r , int ll , int rr , int k)
{
if( rr >= r && ll <= l )
{
lazy[p] += k;
pushup(p,l,r);
return ;
}
int mid = l + r >> 1;
if( rr > mid )change( p * 2 + 1 , mid + 1 , r, ll , rr , k);
if( ll <= mid ) change( p * 2 , l , mid , ll , rr , k);
pushup(p , l , r);
}
int main()
{
cin >> n ;
for(int i = 1 ; i <= n ; i ++)
{
int x1 , y1 , x2 , y2 ;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1 ++, y1 ++, x2 ++ , y2 ++;
seg[m++] = { x1 ,y1 , y2 , 1};
seg[m++] = { x2 ,y1 , y2 , -1};
}
sort(seg ,seg + m);
for(int i = 0; i < m ; i ++)
{
if( i > 0)ans += tree[1] * ( seg[i].x - seg[i - 1].x);
change(1 ,1 , maxn , seg[i].y1 , seg[i].y2 - 1, seg[i].k);
}
cout << ans;
}