牛客算法周周练15
@[toc]
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; }