题解十三:P14028 【MX-X20-T2】「FAOI-R7」最小极差(jicha)
题目。
思路
要使得极差最小,那就要让小的数尽可能变大,大的数尽可能变小。我们可以用
怎么处理
for(ll i=1;i<=m;i++){
cin>>l>>r;
num[l].b++,num[r+1].b--;
}for(ll i=1;i<=n;i++)
num[i].b+=num[i-1].b;
我们依据输入数组的大小从小到大对结构体排序,此时第
事实上,这玩意连样例都过不去。因为此时新的
我们定义最小值
开始时,使
- 如果
mi > a_i ,即a_i 是序列中最小的,我们同样按照“小的数尽可能变大”的原则,获得一个a_i+b_i ,并将它同mi 比较,取一个较小的值更新mi ; - 反之,因为序列单调,后面就没有比它小的了,结束循坏。
for(ll i=1;i<=n;i++){ if(num[i].a<mi) mi=min(mi,num[i].a+num[i].b); else break;
对于
最后,输出答案
代码
//6.70s / 3.61MB / C++17 O2
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll t,n,m,l,r,mi,ma;
struct node{
ll a,b;
}num[200010];
bool cmp(node x,node y){return x.a<y.a;}
int main(){
cin>>t;
while(t--){
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>num[i].a;
num[i].b=0;
}for(ll i=1;i<=m;i++){
cin>>l>>r;
num[l].b++,num[r+1].b--;
}for(ll i=1;i<=n;i++)
num[i].b+=num[i-1].b;
sort(num+1,num+n+1,cmp);
mi=num[1].a+num[1].b;
ma=num[n].a-num[n].b;
for(ll i=1;i<=n;i++){
if(num[i].a<mi)
mi=min(mi,num[i].a+num[i].b);
else break;
}for(ll i=n;i>0;i--){
if(num[i].a>ma)
ma=max(ma,num[i].a-num[i].b);
else break;
}if(ma<mi) cout<<"0\n";
else cout<<ma-mi<<"\n";
}return 0;
}//喜欢就点个赞呗 QAQ