O2暴力线段树100ptsMLE求调
查看原帖
O2暴力线段树100ptsMLE求调
891150
403notfound楼主2023/11/13 12:52
#include <bits/stdc++.h>  
#define ll long long 
#define int long long
using namespace std;
const ll N = 1e7 + 5;
ll n , m , mp[(ll)1e3 + 5] , ans;
ll d[N * 4] , b[N * 4];
//map <ll , ll> b;
//map <ll , ll> d;
void add(ll l , ll r , ll c , ll s , ll t , ll x){
	if (l <= s && t <= r){
		d[x] = c * (t - s + 1);
		b[x] = c;
		return ;
	}ll mid = s + (t - s) / 2;
	if (b[x]){
		b[x * 2] = b[x * 2 + 1] = b[x];
		d[x * 2] = (mid - s + 1) * b[x];
		d[x * 2 + 1] = (t - mid) * b[x];
		b[x] = 0;
	}
	if (l <= mid) add(l , r , c , s , mid , x * 2);
	if (mid < r) add(l , r , c , mid + 1 , t , x * 2 + 1);
	d[x] = d[x * 2] + d[x * 2 + 1]; 
}
ll sum(ll l , ll r , ll s , ll t , ll x){
	if (l <= s && t <= r) return d[x];
	ll tot = 0 , mid = s + (t - s) / 2;
	if (b[x]){
		b[x * 2] = b[x * 2 + 1] = b[x];
		d[x * 2] = (mid - s + 1) * b[x];
		d[x * 2 + 1] = (t - mid) * b[x];
		b[x] = 0;
	}
	if (l <= mid) tot += sum(l , r , s , mid , x * 2);
	if (mid < r) tot += sum(l , r , mid + 1 , t , x * 2 + 1);
	return tot;
}
signed main(){
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 1 , l , r;i <= m;i++){
		cin >> l >> r;
		add(l , r , i , 1 , n , 1);
	}
	for (int i = 1;i <= n;i++){
		ll pos = sum(i , i , 1 , n , 1);
		if (!pos) continue;
//		cout << pos << " ";
		ans += !mp[pos];
		mp[pos] ++;
	}
	cout << ans << "\n";
	return 0;
}
2023/11/13 12:52
加载中...