根据c从小到大排序,然后就无脑区间修改即可。由于l,r范围较大,所以就使用动态开点来做。
没有考虑num[i].a=num[i].b的情况,对于这种特殊情况,数据中也不存在。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N= 4e4 + 5 ;
int n, cnt;
int sum[ N* 100 ] , tag[ N* 100 ] , lson[ N* 100 ] , rson[ N* 100 ] ;
struct number{ int a, b, c; } num[ N] ;
inline bool cmp ( number a, number b) { return a. c< b. c; }
inline void pushdown ( int k, int l, int r, int mid)
{
if ( tag[ k] )
{
sum[ lson[ k] ] = ( mid- l+ 1 ) * tag[ k] ;
sum[ rson[ k] ] = ( r- ( mid+ 1 ) + 1 ) * tag[ k] ;
tag[ lson[ k] ] = tag[ rson[ k] ] = tag[ k] ;
tag[ k] = 0 ;
}
}
void change ( int k, int l, int r, int qx, int qy, int v)
{
if ( qx<= l && r<= qy)
{
sum[ k] = ( r- l+ 1 ) * v;
tag[ k] = v;
return ;
}
if ( ! lson[ k] ) lson[ k] = ++ cnt;
if ( ! rson[ k] ) rson[ k] = ++ cnt;
int mid= l+ r>> 1 ;
pushdown ( k, l, r, mid) ;
if ( qx<= mid) change ( lson[ k] , l, mid, qx, qy, v) ;
if ( mid< qy) change ( rson[ k] , mid+ 1 , r, qx, qy, v) ;
sum[ k] = sum[ lson[ k] ] + sum[ rson[ k] ] ;
}
signed main ( ) {
scanf ( "%lld" , & n) ;
for ( register int i= 1 ; i<= n; ++ i) scanf ( "%lld%lld%lld" , & num[ i] . a, & num[ i] . b, & num[ i] . c) ;
sort ( num+ 1 , num+ n+ 1 , cmp) ;
cnt= 1 ;
for ( register int i= 1 ; i<= n; ++ i) change ( 1 , 1 , 1e9 , num[ i] . a, num[ i] . b- 1 , num[ i] . c) ;
printf ( "%lld\n" , sum[ 1 ] ) ;
return 0 ;
}