题目描述
andy又开始种树了,他觉得老用魔法不太好,这次他决定老老实实地每天种一棵树,第i天种一颗高度为hi的树,按理说老老实实种树就完事了,哪有那么多问题呢?但是他们学校有个叫kotori的人,非常爱砍树,每天都会把所有andy已经种下的树砍掉ci,如果第i天的时候某棵树的高度已经小于等于ci了,那么这棵树就会死亡,以后再也不会被砍了。并且如果到了第n天,有一些树还没被砍,那么kotori就会在第n + 1天把这些树全部砍死。
输入描述:
第一行输入一个整数n,表示andy会种n天的树。
第二行含有n个数hi,表示andy在第i天种的树的高度为hi米。
第三行含有n个ci,表示kotori在第i天把所有andy已经种下的树砍掉ci。
1 <= n, hi, ci <= 105
输出描述:
输出一行n个数di,每个数后面有一个空格(包括最后一个数),最后需要换行。
表示andy第i天种的树会在第di天死亡,如果第n天这棵树还没有死亡,则输出n + 1。
示例1
输入
10
5 7 5 4 1 7 4 3 10 6
6 4 2 4 1 8 5 7 3 5
输出
1 4 4 4 5 6 7 8 11 11
说明
第1天andy种的树高度为5,这天kotori要把andy已经种下的所有树砍掉6,所以第1棵树在第1天就死掉了。
第2天andy种的树高度为7,第2天被kotori砍掉了4,还剩3,第3天被kotori砍掉了2,还剩1。第4天被砍掉4,所以它在第4天死亡。
第10天andy种下的数高度为6,第10天被kotori砍掉了5,还剩1,也就是说它在第10天还没有死亡,所以它会在第11天被kotori砍死(参见题目描述最后一句)。
题意:看提示就懂了,对于一棵树 treei , 问你它会在第几天死,若主人公一直到最后一天还没砍死则输出 n + 1
思路:暴力+模拟+区间和或可预处理前缀和,再二分求天数,数据温暖,前者即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
vector<ll> v , t;
vector<ll> ans;
int n;
cin >> n;
for(int i = 0 ; i < n ; ++ i)
{
ll k;
scanf("%lld",&k);
t.push_back(k);
}
for(int i = 0 ; i < n ; ++ i)
{
ll k;
scanf("%lld",&k);
v.push_back(k);
}
ll sum = v[0] , day = 0;
for(ll i = 0 ; i < n ; ++ i)
{
sum = 0 , day = i;
if(t[i] > sum)
while(day < n && sum < t[i])
{
sum += v[day++];
}
if( sum < t[i]) ans.push_back(n+1);
else ans.push_back(day);
}
for( int i = 0 ; i < ans.size() - 1; ++ i)
printf("%lld " , ans[i]);
printf("%lld\n",ans[ans.size()-1]);
}