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 }

 

posted @ 2017-09-22 23:35  傅judge  阅读(177)  评论(0编辑  收藏  举报