自动收小麦机(牛客2023萌新)

题目链接

自动收小麦机(牛客2023萌新)_第1张图片 

示例1

输入

复制

4 1 2
1 1 4 5
2 2 2 3
4

输出

复制

10

说明

在第4格放出水流后,水流会流向第3格,由于第3格高度比第4格低,所以水流继续向左流向第2格,因为平地水流只能流2格,所以到达第2格后水流停止,收获的小麦数量为1 + 4 + 5 = 10

示例2

输入

复制

5 2 2
1 1 4 5 1
2 2 3 3 4
4
3

输出

复制

9
6

题意:

        从左到右非递减的台阶上每个格子长着ai个小麦,小麦遇到水就会被采集,一个格子的水在同一高度最多可以向外扩散k-1个格子 ,如果高度改变将重新计算扩散(水只会往低处流,q次询问,每次在一个格子上放水,能收集到多少小麦。

思路:

        先用前缀和将小麦求一遍,之后在每次输入台阶高度的时候就进行预处理水能流的情况(水只会往左流),这样可以避免在询问的时候进行多次计算从而超时:

评价:

        非常非常非常简单的一题,但是我不知道什么情况赛时超时之后就一直优化不出来,而且发现代码能力显著下降了,是最近松懈了,反思,重努力找回状态



#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
//#include
#include
#include
#include
#define dbug cout<<"hear!"<=c;a--)
#define no cout<<"NO"<,greater >q;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair PII;
typedef pair PDD;
 ll  INF = 0x3f3f3f3f;
//const ll LINF=LLONG_MAX;
// int get_len(int x1,int y1,int x2,int y2)
// {
//   return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
// }
const ll N = 1e6+ 10;
const ll mod1 =998244353;
const ll mod2 =1e9+7;
const ll hash_num = 3e9+9;
ll n,m,ca, k, p,ans;
ll arr[N],brr[N],crr[N];
 ll h[N],ne[N],e[N],w[N],book[N],idx;
ll hh[N];
//ll book[N];



void solve()
{
    ll q;
      cin >> n >> q >> k;
    for(int  i = 1; i <= n; i ++ ){
        cin >> w[i];
        w[i] += w[i - 1];
    }
    int last = 1;
    cin >> h[1];
    hh[1] = 1;
    last = 1;
    rep(i,2,n){
        cin >> h[i];
        if(h[i] != h[i - 1]){
            last = i - 1;
        }
        if(h[max(i - k + 1, ll(1))] == h[i]){
            hh[i] = i - k + 1;
        }
        else{
            hh[i] = hh[last];
        }
    }
    while(q--)
    {
        int ip;
        cin >> ip;
        cout << w[ip]-w[hh[ip]-1]<>_;
    ca=1;
    while(_--)
    {
      solve(); 
      ca++;
    }    
    return 0;
}

你可能感兴趣的:(算法,c++)