69,369
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
long range_datas[200000];
int ul_cmp(const void *l, const void *r)
{
return *(long*)l - *(long*)r >0?1:-1;
}
int main()
{
long n;
int t, m, i, j, k;
long count;
long rl, rr;
scanf("%d", &t);
for(i = 0; i< t; ++i){
scanf("%ld %d", &n, &m);
k = 0;
for(j =0; j< m; ++j){
scanf("%ld %ld", &rl, &rr);
range_datas[k++] = rl;
range_datas[k++] = rr+1;
}
qsort((void*)&(range_datas[0]), m*2, sizeof(range_datas[0]), ul_cmp );
count = 0;
for(j = 0; j<m*2; j+=2){
count += (range_datas[j+1] - range_datas[j]);
}
printf("Case #%d\n%ld\n", i+1, count);
}
return 0;
}
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
struct range
{
unsigned long left;
unsigned long right;
bool empty()
{
return left == right;
}
};
inline bool operator<(range left, range right)
{
return left.left < right.left;
}
inline std::istream& operator>>(std::istream& is, range& r)
{
is>>r.left>>r.right;
r.right++;
return is;
}
void range_xor(range r1, range r2, range &result_left, range& result_right)
{
int a, b, c, d;
a = r1.left;
b = r2.left;
if(a > b ){
std::swap(a, b);
}
c = r1.right;
d = r2.right;
if(c > d){
std::swap(c, d);
}
if(b > c){
std::swap(b, c);
}
result_left.left = a;
result_left.right = b;
result_right.left = c;
result_right.right = d;
}
class bitRangeNumber
{
public:
//bitRangeNumber(range r);
//void bit_xor(const bitRangeNumber& number);
void bit_xor(range r);
unsigned long caculate_count_of_1()const;
private:
std::list<range> range_set; //ordered
typedef std::list<range>::iterator Iter;
typedef std::list<range>::const_iterator CIter;
Iter lower_bound(unsigned long left);
// CIter lower_bound(unsigned long left)const;
};
int main()
{
int t, n, m;
std::cin >> t;
for(int i=0; i< t; ++i){
std::cin>> n >> m;
bitRangeNumber brn;
for(int j= 0; j< m; ++j){
range r;
std::cin>> r;
brn.bit_xor(r);
}
std::cout<<"Case #"<<i+1<<":\n"<<brn.caculate_count_of_1()<<"\n";
}
return 0;
}
void bitRangeNumber::bit_xor(range r)
{
Iter iter = lower_bound(r.left);
for(;;) {
if(iter == range_set.end() || r.right < (*iter).left ){
range_set.insert(iter, r);
break;
}
if(r.right == (*iter).left ){
(*iter).left = r.left;
break;
}
range_xor(*iter, r, *iter, r);
if( (*iter).empty() ){
range_set.erase(iter++);
continue;
}
if(r.empty() ){
break;
}
}
}
bitRangeNumber::Iter bitRangeNumber::lower_bound(unsigned long left)
{
range r;
r.left = left;
return std::lower_bound(range_set.begin(), range_set.end(), r);
}
unsigned long bitRangeNumber::caculate_count_of_1()const
{
unsigned long count =0;
for(CIter iter = range_set.begin(); iter != range_set.end(); ++iter){
count += ( (*iter).right - (*iter).left );
}
return count;
}