题目:
分析:
1.第一看,早上刚做了一道题,那个前+,后-统计区间内涉及到数的个数。
本来想用这个思路,一看数据。
想了想,如果不需要对每个数单独处理,那么直接末减初就可以啦!
2.第二看,理解错了,区间内的数只统计一次。map来搞!
#include <bits/stdc++.h>
using namespace std;
map< int , int > mm;
int main ( )
{
int m;
cin>> m;
long long ans= 0 ;
for ( int i= 0 ; i< m; i++ )
{
int a, b;
cin>> a>> b;
for ( int i= a; i< b; i++ )
{
if ( mm[ i] == 1 ) continue ;
mm[ i] = 1 ;
ans++ ;
}
}
cout<< ans;
}
set试试。
#include <bits/stdc++.h>
using namespace std;
set< int > s;
int main ( )
{
int m;
cin>> m;
long long ans= 0 ;
for ( int i= 0 ; i< m; i++ )
{
int a, b;
cin>> a>> b;
for ( int i= a; i< b; i++ )
{
s. insert ( i) ;
}
}
cout<< s. size ( ) ;
}
看了一眼答案,要排序。
嗯,然后自己想出来了:
#include <bits/stdc++.h>
using namespace std;
struct node{
int x1, x2;
} nn[ 20005 ] ;
bool cmp ( node n1, node n2)
{
return n1. x1< n2. x1;
}
int main ( )
{
int m;
cin>> m;
long long ans= 0 ;
for ( int i= 0 ; i< m; i++ )
{
cin>> nn[ i] . x1>> nn[ i] . x2;
}
sort ( nn, nn+ m, cmp) ;
int last= nn[ 0 ] . x1;
for ( int i= 0 ; i< m; i++ )
{
last= max ( nn[ i] . x1, last) ;
if ( nn[ i] . x2<= last) continue ;
ans+ = nn[ i] . x2- last;
last= max ( last, nn[ i] . x2) ;
}
cout<< ans;
}