为什么线段树开6倍空间才过
查看原帖
为什么线段树开6倍空间才过
1048327
KANO07楼主2024/3/5 18:18

一开始开了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;
}
2024/3/5 18:18
加载中...