codevs1299: 切水果
题目描述 Description
简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的水果被重复切),每切完一次输出剩下水果数量
数据已重新装配,不会出现OLE错误
时限和数据范围适当修改,避免数据包过大而浪费空间资源
输入描述 Input Description
第1行共包括2个正整数,分别为N,M。
接下来m行每行两个正整数L,R
输出描述 Output Description
一共输出M行,每行输出切完之后剩下水果数量
样例输入 Sample Input
10 3
3 5
2 8
1 5
样例输出 Sample Output
7
3
2
数据范围及提示 Data Size & Hint
30%的数据满足N,M<=5,000
60%的数据满足N,M<=100,000
100% 的数据满足1<=L<=R<=N<=500,000,1<=M<=500,000
题解
一种并查集的模型,类似于缩点的思想??注意要多预处理几位的fa[i],不然如果跳出去了会导致fa[i]=0,然后跳回去,就死环了。。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define maxn 500010 5 using namespace std; 6 int n,m,fa[maxn],ans,l,r; 7 int find(int x) 8 { 9 return x==fa[x]?x:fa[x]=find(fa[x]); 10 } 11 int main() 12 { 13 scanf("%d%d",&n,&m); 14 for(int i=1 ; i<=n+5 ; ++i)fa[i]=i; 15 for(int i=1 ; i<=m ; ++i ) 16 { 17 scanf("%d%d",&l,&r); 18 if(n-ans<0) 19 { 20 printf("0\n"); 21 continue; 22 } 23 for(int j=l ; j<=r; ) 24 { 25 int fx=find(j); 26 if(fx==j) 27 { 28 fa[j]=j+1; 29 ++ans; 30 j++; 31 } 32 else 33 { 34 j=fx; 35 } 36 } 37 if(n-ans<0)printf("0\n"); 38 else printf("%d\n",n-ans); 39 } 40 return 0; 41 }