第k小连续字串问题
【MX-J3-T2】Substring
题意简述
给你
思路分析
以下“区间”,“子串”均指连续子串。
求第
这样的时间复杂度是
但是我们这样考虑: 钦定一个区间,比如
而
然后考虑区间左端点不同的情况,由于是排列,左端点不同就是最左的数字不同。所以我们可以先排个序,然后维护一个类似前缀和的数组
排序之前要把原下标记录一下。
时间复杂度
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,sum[300005];
pair<int,int>a[300005];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i].first,a[i].second=i;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+n-a[i].second+1;
for(int x;q--;){
cin>>x;
int pos=lower_bound(sum+1,sum+n+1,x)-sum;
x-=sum[pos-1];
cout<<a[pos].second<<" "<<a[pos].second+x-1<<"\n";
}
return 0;
}