这道题是看了 BestCoder 的题解才AC的,,虽然自己的做法没有它快,但不知道错在何处 ;
思路:对于每一条 line ,令 xi 的权值为1 , yi+1 的权值为 -1 , 对所有的节点排序, 求最大前缀和 ;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
const int N = 100000 + 11 ;
pair<int ,int> arr[N<<1] ;
int main() {//freopen("data.in" , "r", stdin) ;
int t , n ;
scanf("%d" ,&t) ;
while(t--) {
scanf("%d" ,&n) ;
int k = 0 ;
int a , b ;
for(int i = 0 ; i < n ; ++i) {
arr[k].second = 1 ;
scanf("%d" ,&arr[k++].first) ;
arr[k].second = -1 ;
scanf("%d" ,&arr[k++].first) ;
arr[k-1].first++ ;
}
sort(arr , arr+k) ;
int m = 0 ;
int sum = 0 ;
for(int i = 0 ; i <k ; ++i) {
sum += arr[i].second ;
if(sum > m) m = sum ;
if(sum < 0) sum = 0 ;
}
printf("%d\n" , m) ;
}
}
WA的代码,如果有人看到那错了,麻烦请告诉我
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std ;
const int N = 100000 + 11 ;
vector<pair<int , int> > arr(N) ;
bool flag[N] ;
int main() {
int t , n ;
scanf("%d" ,&t) ;
while(t--) {
set<int> sset ;
arr.clear() ;
memset(flag , 0 , sizeof(flag)) ;
scanf("%d" ,&n) ;
int a , b;
for(int i = 0 ; i < n ;++i) {
scanf("%d%d",&a ,&b);
arr.push_back(make_pair(a , b)) ;
}
sort(arr.begin() ,arr.end()) ;
int m = 0 ;
for(int i = n-1 ; i >= 0 ; --i) {
const int& a = arr[i].first ;
if(sset.count(a)) continue ;
sset.insert(a) ;
int sum = 0 ;
for(int j = i ; j >= 0 ; --j) {
if(arr[j].second >= a) {
++sum ;
}else break ;
}
if(sum > m) m = sum ;
}
printf("%d\n" , m) ;
}
}