题意是给了n个数,m个区间,对于每个区间可以让当前区间内所有数-1,然后问可以挑选任意个区间,求一个最大的max(a[i]) - min(a[i])。
对于这种【更新区间】---->>求【两点最大差值】的问题,我们可以尝试换一种方式去求
由于数据范围只有300,我们可以【枚举两点】最小值和最大值的位置,然后去【挑选有贡献的区间】
#include<bits/stdc++.h>
using namespace std;
int l[350],r[350];
int a[350];
int x[350],y[350];
int main()
{
int n,m,ans=0,k=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d %d",&l[i],&r[i]);
for(int i=1;i<=n;i++){/// 枚举最小值的位置
for(int j=1;j<=n;j++){/// 枚举最大值的位置
if(i==j) continue;
int tm=a[j]-a[i];//最大减最小
int c=0;//区间个数
for(int h=1;h<=m;h++){
if((l[h]<=i&&r[h]>=i)&&(j<l[h]||j>r[h])){
c++;tm++;x[c]=h;//产生贡献1
}
}
if(tm>ans){// 更新最大值以及区间答案
ans=tm,k=c;
for(int ti=1;ti<=k;ti++) y[ti]=x[ti];
}
}
}
printf("%d\n%d\n",ans,k);
for(int i=1;i<=k;i++)
printf("%d ",y[i]);
printf("\n");
}