原题题目
一看这个题,哦,原来是快排,但是似乎还要加一点东西,快排只能排序,咱们还要输出特定的数字,所以想到前缀和,这个三似乎就是排序后,s[i]-s[i-1]的解法!
代码实现
#include<iostream>
using namespace std;
const int N=1000010;
int n,m;
int q[N],s[N];
void quick_sort(int q[],int l,int r)
{
if(l>=r)return;
int x=q[l+r>>1],i=l-1,j=r+1;
while(i<j)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j)swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main()
{
cin>> n>> m;
for(int i=0;i<n;i++)cin>> q[i];//初始化数组,读入数字
quick_sort(q,0,n-1);
for(int i=0;i<n;i++)s[i]=s[i-1]+q[i];//前缀和
int res=0;
res=s[m-1]-s[m-2]; //前缀和去掉循环,即去掉了m次询问,直接求第一个即可。
cout <<res;
return 0;
}
前缀和无非是加了一个m次询问,输出了很多组数组,咱们把他去掉,诶,就出现个新用法!
看来唯有多学习,多练习才是王道,时间花在这上面就对喽!
思路总结
多看算法,记牢才能活用,用多了思路就打开了。好比把基础模板学会,再融会贯通,原本属于快排的题,快排+前缀和也能做出来,能做就是好算法。加自己理解的才是自己的!加油!