O(n)地枚举所有长度为k的段,每次暴力转移。
转移的时候只是从最后插入一个数,从前面删去一个数。
计算的时候要取当前的max和min。
用multiset(∵元素是可重的)以上这些操作都是O(logn)的。
1 #include<cstdio> 2 #include<set> 3 using namespace std; 4 multiset<int>S; 5 multiset<int>::iterator it; 6 int n,m,limit; bool goal; 7 int a[1000001]; 8 int main() 9 { 10 scanf("%d%d%d",&n,&m,&limit); 11 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 12 for(int i=1;i<=m;i++) S.insert(a[i]); 13 it=S.end(); it--; 14 if((*it)-(*S.begin())<=limit) puts("1"),goal=1; 15 for(int i=2;i<=n-m+1;i++) 16 { 17 S.erase(S.find(a[i-1])); 18 S.insert(a[m+i-1]); 19 it=S.end(); it--; 20 if((*it)-(*S.begin())<=limit) printf("%d ",i),goal=1; 21 } 22 if(!goal) puts("NONE"); 23 return 0; 24 }