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;
}