数据范围有问题!
查看原帖
数据范围有问题!
219202
code_hunter楼主2021/7/5 15:22

[捞贴] (https://www.luogu.com.cn/discuss/show/283648)

本蒟蒻 20 分代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

#define For(i,a,b) for(ll i = a ; i <= b ; i ++)
#define FoR(i,a,b) for(ll i = a ; i >= b ; i --)
typedef long long ll;
typedef double dl;
ll MAX(ll x , ll y) {return (x > y) ? x : y;}
ll MIN(ll x , ll y) {return (x < y) ? x : y;}

const int MAXN = 1e5 + 123; 

using namespace std;

inline int Read() {
	register int x = 0;
	bool flag = false;
	register char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-')
			flag = true;
		ch = getchar();
	}
	if (flag) {
	    while ('0' <= ch && ch <= '9') {
	   		 x = x * 10 - ch + '0';
			 ch = getchar();
	    }
	}
	else {
        while ('0' <= ch && ch <= '9') {
	   		 x = x * 10 + ch - '0';
			 ch = getchar();
	    }
	}
	return x;
}

ll N;
struct rectangle{
	ll x1 , x2;
	ll y0;
	ll val;
	bool operator < (rectangle b) {
		return y0 < b.y0;
	}
}a[MAXN << 1 | 1]; 
ll x[MAXN] , tpx;

void input() {
	N = Read();
	For (i , 1 , N) {
		x[++ tpx] = a[i].x1 = a[i + N].x1 = Read();
		a[i].y0 = Read();
		x[++ tpx] = a[i].x2 = a[i + N].x2 = Read();
		a[i + N].y0 = Read();
		a[i].val = -1;
		a[i + N].val = 1;
	}
	sort(x + 1 , x + tpx + 1);
	tpx = unique(x + 1 , x + tpx + 1) - x - 1;
	For (i , 1 , N) {
		a[i].x1 = a[i + N].x1 = lower_bound(x + 1 , x + tpx + 1 , a[i].x1) - x;
		a[i].x2 = a[i + N].x2 = lower_bound(x + 1 , x + tpx + 1 , a[i].x2) - x;
		//printf ("%d %d\n" , a[i].x1 , a[i].x2);
	}
	sort(a + 1 , a + (N << 1 | 1));
}

ll ans = 0;
struct segment_tree{
	ll cnt , len;
}e[MAXN << 4 | 1];

void modify(ll o , ll l , ll r , ll ql , ll qr , ll val) {
	if (ql <= l && r <= qr) {
		e[o].cnt += val;
		if (e[o].cnt)
			e[o].len = x[r + 1] - x[l];
		else
			e[o].len = e[o << 1].len + e[o << 1 | 1].len;
		return;
	}
	ll mid = (l & r) + ((l ^ r) >> 1);
	if (ql <= mid)
		modify(o << 1 , l , mid , ql , qr , val);
	if (qr > mid)
		modify(o << 1 | 1 , mid + 1 , r , ql , qr , val);
		
	if (e[o].cnt)
		e[o].len = x[r + 1] - x[l];
	else
		e[o].len = e[o << 1].len + e[o << 1 | 1].len;
}

void solve() {
	For (i , 1 , (N << 1) - 1) {
		modify(1 , 1 , tpx - 1 , a[i].x1 , a[i].x2 - 1 , a[i].val);
		ans += (a[i + 1].y0 - a[i].y0) * e[1].len;
	}
	printf ("%lld\n" , ans);
}

int main() {
	input();
	solve();
    return 0;
}

MAXN 改为 1e6 + 123 就 AC 了。

2021/7/5 15:22
加载中...