#include<iostream>
#include<algorithm>
#include<math.h>
typedef long long ll;
using namespace std;
const int N=1e5+10,mod=1e9+7;
ll sum,minsum,a[N],i,j;
int main()
{
int n,k;
cin>>n>>k;
for(i=0;i<n;i++)cin>>a[i]; //数组输入
while(k--)
{
int op,x;
cin>>op>>x;
if(op==1)sum+=x; //记录值的加减
else sum-=x; //记录值的加减
minsum=min(sum,minsum); //记录最小值
}
ll ans=0;
for(i=0;i<n;i++)
{ //下面一行的sum+a[i]是变化后的值
if(a[i]+minsum>=0)ans=(ans+a[i]+sum)%mod;
//下面一行的sum-minsum是后来op为1时,增加的值
else ans=(ans+sum-minsum)%mod;
}
cout<<ans<<endl;
return 0;
}
上面是看过别人的讲解之后,才能弄懂的,本来只看了答案,自己是一头雾水。我本来的想法就是按照题目的要求,一步一步的去写代码,理论上是可以运行的,但是没有考虑时间复杂度这个问题。我的时间复杂度是o(n^2),时间复杂度过大,只过了百分之四十。
以下是我最初写的,时间复杂度过大
#include<iostream>
#include<algorithm>
#include<math.h>;
typedef long long ll;
using namespace std;
int main()
{
ll a[100010],b,c,n,k,i,j,sum=0;
cin>>n>>k;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<k;i++)
{
cin>>b>>c;
if(b==1)
{
for(int i=0;i<n;i++)
{
a[i]=a[i]+c;
if(a[i]<0)
a[i]=0;
}
}
if(b==2)
{
for(int i=0;i<n;i++)
{
a[i]=a[i]-c;
if(a[i]<0)
a[i]=0;
}
}
}
for(int i=0;i<n;i++)
sum+=a[i];
cout<<sum<<endl;
return 0;
}