SWJTU 2208 最大覆盖

最大覆盖

Time Limit:1000MS  Memory Limit:32768K
Total Submit:20 Accepted:7

Description

我们定义一条线段,首先可以认为它在X轴上,它的起点为(a,0)终点为(b,0),所以我们可以简化成[a,b]。现在我们有N条这样的线段都位于X轴上,所以肯定存在一点被覆盖多次或者一次,我们的任务就是找到最多被覆盖的次数,请参考样例便于理解。

Input

第一行输入为一个整数N(1≤N≤10^5),表示我们有N条线段,接下来的N行每行包括两个整数a,b(1≤a≤b≤10^9)表示线段的起点和终点。

Output

输出一个整数表示被覆盖的最大次数。

Sample Input

 

5
1 2 
2 2
2 4
3 4
5 1000
3
1 1
2 2
3 3

 

Sample Output

 

3
1

 

Hint

对于第一组我们可以发现2被覆盖次数最多为3次,依次被[1 2],[2 2],[2 4]这三条线段覆盖,所以输出为3。
对于第二组最大覆盖次数为1且1 2 3都被覆盖1次,所以输出1。

 

思路: 先扫描思想

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<numeric>
13 #include<cmath>
14 #include<stdlib.h>
15 #include<vector>
16 #include<stack>
17 #include<set>
18 #define FOR(x, b, e)  for(int x=b;x<=(e);x++)
19 #define REP(x, n)     for(int x=0;x<(n);x++)
20 #define INF 1e7
21 #define MAXN 100010
22 #define maxn 1000010
23 #define Mod 1000007
24 #define N 1010
25 using namespace std;
26 typedef long long LL;
27 
28 
29 bool flag[N], a[N][N];
30 int ans, cnt[N], group[N], n, m, vis[N];
31 bool dfs(int u, int pos){
32     int i, j;
33     for (i = u + 1; i <= n; i++){
34         if (cnt[i] + pos <= ans) return 0;
35         if (a[u][i]){
36             // 与目前团中元素比较,取 Non-N(i) 
37             for (j = 0; j < pos; j++) if (!a[i][vis[j]]) break;
38             if (j == pos){     // 若为空,则皆与 i 相邻,则此时将i加入到 最大团中 
39                 vis[pos] = i;
40                 if (dfs(i, pos + 1)) return 1;
41             }
42         }
43     }
44     if (pos > ans){
45         for (i = 0; i < pos; i++)
46             group[i] = vis[i]; // 最大团 元素 
47         ans = pos;
48         return 1;
49     }
50     return 0;
51 }
52 
53 void maxclique()
54 {
55     ans = -1;
56     for (int i = n; i > 0; i--)
57     {
58         vis[0] = i;
59         dfs(i, 1);
60         cnt[i] = ans;
61     }
62 }
63 
64 int main(){
65     int T;
66     scanf("%d", &T);
67     while (T--){
68         scanf("%d%d", &n, &m);
69         int x, y;
70         memset(a, 0, sizeof(a));
71         for (int i = 0; i < m; i++){
72             scanf("%d%d", &x, &y);
73             a[x][y] = a[y][x] = 1;
74         }
75         for (int i = 1; i <= n; i++)
76             for (int j = 1; j <= n; j++)
77                 if (i == j) a[i][j] = 0;
78                 else    a[i][j] ^= 1;
79                 maxclique();
80 
81                 if (ans < 0) ans = 0;
82                 printf("%d\n", ans);
83                 for (int i = 0; i < ans; i++)
84                     printf(i == 0 ? "%d" : " %d", group[i]);
85                 if (ans > 0) puts("");
86     }
87     return 0;
88 }
代码君

 

posted @ 2015-03-30 18:19  UsedRose  阅读(107)  评论(0编辑  收藏  举报