校门外的树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("\n"); 42 } 43 return 0; 44 }