校门外的树4

校门外的树4
题目描述
某校大门外长度为L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米。我们可
以把马路看成一个数轴,马路的一端在数轴1 的位置,另一端在L 的位置;数轴上的每个整
数点,即1,2,……,L,都种有一棵树。
由于学校要盖楼。所以要将一些比较高的树砍下来当木材。学校想知道砍下某些树之后,
还剩下多少段连续树的树木。
比如马路的长度是5,那么1,2,3,4,5 处各有一颗树。他们的高度分别是2,7,3,5,1。现在
学校想砍掉最高的1 颗树。那么,就会剩下2 段树木,一段是从下标1 开始到下标1 结束的
树,另一段是从下标为3 开始到下标为5 结束的树。
输入格式
输入的第一行有两个整数L(1 <= L <= 106)和M(1 <= M <= 105),L 代表马路的长度,
M 代表总共砍M 次树。
第二行包含L 个不相同的正整数,为树木的高度h(0< h < 108)。
第三行包含M 个正整数k[i],表示学校想砍掉最高的k[i]颗树(0 < k[i] < 105)。
保证树木不会被砍光
输出格式
总共输出M 行,学校每次砍完一次树(k 颗),输出一个数字,这个数字占一行,表示剩
下多少段树。
样例输入
5 2
2 7 3 5 1
1 1
样例输出
2
3
提示
成吨的输入量,请进行IO 优化。
本题时间限制3 秒

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int i,j,m,n,l,da = 1,vis[1000005],op,t = 0;
 7 struct node
 8 {
 9     int h;
10     int x;
11 }a[1000005];
12 int cmp(node a,node b)
13 {
14     return a.h > b.h;
15 }
16 int main()
17 {
18     scanf("%d %d",&l,&m);
19     for(i = 1;i <= l;i++)
20     {
21         vis[i] = 1;
22         scanf("%d",&a[i].h);
23         a[i].x = i;
24     }
25     sort(a + 1,a + 1 +l,cmp);
26     for(i = 1;i <= m;i++)
27     {
28         scanf("%d",&op);
29         for(j = op;j >= 1;j--)
30         {
31             t = t + 1;
32             a[t].h = 0;
33             if(vis[a[t].x - 1] == 1 && vis[a[t].x + 1] == 1)
34             da++;
35             else if(vis[a[t].x - 1] != 1 && vis[a[t].x + 1] != 1)
36             da--;
37             vis[a[t].x] = 0;
38         }
39         printf("%d",da);
40         if(i != m)
41         printf("
");
42     }
43     return 0;
44 }
原文地址:https://www.cnblogs.com/rax-/p/9799779.html