牛客算法周周练15
文章目录
- A 数列下标
- B 可持久化动态图上树状数组维护01背包
- C 璀璨光滑
- D 树上求和
- E 算式子
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;
}