一开始开了4,5倍,re,是哪里溢出了呢?
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const ll N = 1e5 * 6 + 5; //这里
ll ls(ll x){return x * 2;}
ll rs(ll x){return x * 2 + 1;}
ll tag[N];
ll len[N];
ll xx[N];
struct scanline{
ll x1, x2, y, io;
bool operator< (const scanline & a)const{
return y < a.y;
}
}line[N];
void push_up(ll p, ll pl, ll pr){
if(tag[p]) len[p] = xx[pr + 1] - xx[pl];
else if(pl == pr) len[p] = 0; //特判叶子
else len[p] = len[ls(p)] + len[rs(p)];
}
void update(ll p, ll io, ll pl, ll pr, ll l, ll r){
if(l <= pl && pr <= r){
tag[p] += io;
push_up(p, pl, pr);
return;
}
ll mid = (pl + pr) / 2;
if(l <= mid) update(ls(p), io, pl, mid, l, r);
if(r > mid) update(rs(p), io, mid + 1, pr, l, r);
push_up(p, pl, pr);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
ll n;
cin>>n;
ll cnt = 0;
for(int i = 0; i < n; i++){
ll x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
line[++cnt] = {x1, x2, y1, 1};
xx[cnt] = x1;
line[++cnt] = {x1, x2, y2, -1};
xx[cnt] = x2;
}
sort(line + 1, line + 1 + cnt);
sort(xx + 1, xx + 1 + cnt);
ll m = unique(xx+1, xx+1+cnt) - (xx+1);
ll ans = 0;
for(int i = 1; i <= cnt; i++){
ans += len[1] * (line[i].y - line[i-1].y);
ll l = lower_bound(xx + 1, xx + 1 + m, line[i].x1) - xx;
ll r = lower_bound(xx + 1, xx + 1 + m, line[i].x2) - xx;
update(1, line[i].io, 1, m-1, l, r-1);
}
cout<<ans<<endl;
return 0;
}