/* lines Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 590 Accepted Submission(s): 277 Problem Description John has several lines. The lines are covered on the X axis. Let A is a point which is covered by the most lines. John wants to know how many lines cover A. Input The first line contains a single integer T(1≤T≤100)(the data for N>100 less than 11 cases),indicating the number of test cases. Each test case begins with an integer N(1≤N≤105),indicating the number of lines. Next N lines contains two integers Xi and Yi(1≤Xi≤Yi≤109),describing a line. Output For each case, output an integer means how many lines cover A. Sample Input 2 5 1 2 2 2 2 4 3 4 5 1000 5 1 1 2 2 3 3 4 4 5 5 Sample Output 3 1 Source BestCoder Round #20 */ #include<stdio.h> #include<string.h> #include<stdlib.h> int comp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int a[100005],b[100005]; int main() { int cases,j,i,temp_j,temp_i,p,cnt,max,n; scanf("%d",&cases); while(cases--) { memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); max=-1,cnt=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a[i],&b[i]); } qsort(a,100005,sizeof(int),comp); qsort(b,100005,sizeof(int),comp); for(j=0;;j++){if(b[j]!=-1) break;} temp_j=j; for(i=0;i<100005;i++) { if(a[i]==-1) continue; if(a[i]>b[j]) { cnt--; j++; temp_j=j; break; } else { p=1; cnt++;temp_i=i; if(cnt>max) max=cnt; while(p) { if(a[++temp_i]==a[i]){break;} while(1) { if(b[temp_j++]==a[i]) {cnt--;j++;temp_j=j;} else {p=0;temp_j=j;break;} } } } } printf("%d\n",max); } return 0; } //这题是一次bc的b题,下面是大仙的代码,和我的想法一样, 不过他用结构体标记左右端点,再混合排序,而我对结构体不熟悉 //没想到用这个所以就用a,b数组讨论成数组的形式,思维情况比较复杂,wa了5,6次。最后还是ac了 ,时间和大仙的那个差不多,差了100ms左右。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct line{ int x; int flag; }L[200010]; bool cmp(line a,line b){ if(a.x<b.x||(a.x==b.x&&a.flag<b.flag)) return 1; return 0; } int main() { int _,n,all,a,b; scanf("%d",&_); //用_作为循环变量,值得学习。 while(_--){ scanf("%d",&n); all=0; for(int i=1;i<=n;i++){ scanf("%d%d",&a,&b); L[all].x=a; L[all++].flag=0; L[all].x=b; L[all++].flag=1; } sort(L,L+all,cmp); int total=0; int ma=0; for(int i=0;i<all;i++){ if(L[i].flag==0) total++; else total--; if(total>ma) ma=total; } printf("%d\n",ma); } return 0; } //大仙的ac的代码。