CSU 1487 未覆盖顶点数量
2013-05-12 10:39
253 查看
Description
有N个顶点,每个顶点有一个权值,初始值皆为0。接下来有M次操作,操作内容为 [a,b) or [b,a),将区间内顶点i 权值置为1,求最后顶点权值为0的数量。Input
多组测试数据。第一行为两个整数n, m,n(1<=n<=20000)表示顶点, m(1<=m<=50000)表示操作次数。
接下来包含m行,每行包含两个正整数 a,b属于区间[1,n] ,意义如上所述。
Output
每组测试输出一行,包含一个整数,表示顶点值为0的数量。Sample Input
3 1 1 2 3 1 1 3
Sample Output
2 1 解题思路: 一看到这题可能就会容易想到应该用树状数组来解,我一开始也是这样想的,但如果每做一次操作都要对树状数组更新一次的话,这样 极有可能会TLE,所以只好另辟蹊径了。 方法是将每次操作的区间的前一个数的对应位置的值记为区间的后一个数的值,在做完所有的操作之后 对记录的数组扫一遍,当用一个max记录区间左端点最小的区间的右端点的值,当扫 记录数组的时候遇到某个位置的值比max大的时候就将max进行更新, 当所走到的这个位置的下标比max小的时候就将sum加一,最后sum的值即为值为1 的点的个数,这样值为0的点的个 数用n减掉sum就可以啦
View Code
#include<stdio.h> #include<string.h> int A[20005],n,m; int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(A,0,sizeof(A)); int x,y; int min; if(m!=0) { scanf("%d%d",&x,&y); if(x>y) { int d=x; x=y; y=d; } A[x]=y; min=x; } m--; while(m>0) { scanf("%d%d",&x,&y); if(x>y) { int d=x; x=y; y=d; } if(y>A[x]) A[x]=y; if(x<min) min=x; m--; } int max=A[min]; int sum=0; for(int i=1;i<=n;++i) { if(A[i]>max) max=A[i]; if(max>i&&i>=min) sum++; } int ans=n-sum; printf("%d\n",ans); } return 0; }
相关文章推荐
- 1487: 未覆盖顶点数量.
- CSUST 1487 未覆盖顶点数量
- (hdu step 6.3.1)Strategic Game(求用最少顶点数把全部边都覆盖,使用的是邻接表)
- poj 2226-二分图的最小顶点覆盖
- zoj 1492 最大团顶点数量
- hud1150二分图最小顶点覆盖
- 树的最小顶点覆盖
- HDU1150 Machine Schedule(最小顶点覆盖)
- HDU 1150 Machine Schedule(最小顶点覆盖)
- poj3041(最小顶点覆盖)
- 匈牙利算法 hdu 1151有向图的最小路径覆盖=顶点数-最大匹配数
- HDU 1150 Machine Schedule (匈牙利算法 最小顶点覆盖= 最大匹配数)
- pku3308 【论】如何将二分图顶点覆盖问题转化为最小割
- poj1422 Air Raid 最小路径覆盖=顶点数-最大匹配数
- hdu 1498 最小顶点覆盖
- POJ3041 最小顶点覆盖
- poj3041 二分图最小顶点覆盖
- CUGB图论专场2:B - Asteroids 二分图:最小顶点覆盖=最大匹配数
- 【最小顶点覆盖】POJ 3041
- poj3041 Asteroids(最小顶点覆盖经典模型)