如下,思路是:
对于一个工作,给第 l−d+1 天到第 r 天的 cnt 加一(用差分写);
处理 cnt 时逐一比较。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
int n,d,k;
int cnt[1000000+5];
signed main(){
cin>>t;
while(t--){
memset(cnt,0,sizeof(cnt));
int cnt1=-1,cnt2=1000000+5,ans1,ans2;
cin>>n>>d>>k;
if(n-d+1<=0){
cout<<1<<" "<<1;
continue;
}
for(int i=1;i<=k;i++){
int l,r;
cin>>l>>r;
cnt[max(1ll,l-d+1)]++,cnt[min(r+1,n+1)]--;
}for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
for(int i=1;i<=n-d+1;i++){
if(cnt[i]>cnt1){
cnt1=cnt[i];
ans1=i;
}if(cnt[i]<cnt2){
cnt2=cnt[i];
ans2=i;
}
}
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}
本代码时间复杂度应该是 O(∑n) 的,但为什么会 TLE?求条+玄关。