牛客算法周周练15

A 数列下标

题意很明确,再看看数据,所以我们直接两重循环,用数组b来记录右边第一个大的数的下标
代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll a[10004];
ll b[10004];
int main()
{
   
    int n;
    cin>>n;
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
   
        cin>>a[i];
        if(i==1)cnt=a[i];
    }
    for(int i=1;i<=n;i++)
    {
   
        for(int j=i+1;j<=n;j++)
        {
   
            if(a[j]>a[i])
            {
   
                b[i]=j;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
   
        cout<<b[i]<<" ";
    }
     
}

B 可持久化动态图上树状数组维护01背包

这名字太虎人了,吓得我一度不敢做
a可正可负,我们分类讨论
当a为正时,我们要让代价最小,最要让a尽可能在前面,所以从第一位顺着删就可以了
当a为负时,我们要让代价最小,其实就要让负的值最大,所以负的越往后越好,那我们就倒着删去就可以了
先删负数,最后只剩下正数,全部加上即可
本题和标题说的啥关系也没有
代码:

#include<bits/stdc++.h>
typedef unsigned long long ull;
typedef long long ll;
using namespace std;
const int maxn=1e6+99;
ll a[maxn];
ll sum;
bool w[maxn];
int main()
{
   
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
   
        cin>>a[i];
        if(a[i]<0)w[i]=0;
        else if(a[i])w[i]=1;
    }
        for(int i=1;i<=n;i++)
    {
   
        if(w[i]==0)sum+=a[i]*i;
     }
    for(int i=1;i<=n;i++)
    {
   
        if(w[i])
        sum+=a[i];
    }
 
    cout<<sum;
}

C 璀璨光滑

D 树上求和

E 算式子