33,007
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
template <class T>
int _partition(T a[], int p, int r, T x)
{
for (int i=p; i<r; i++)
{
if (a[i] == x)
{
swap(a[i], a[r]);
break;
}
}
int i = p-1;
for (int j=p; j<r; j++)
{
if (a[j] <= x)
{
i++;
swap(a[i], a[j]);
}
}
swap(a[i+1], a[r]);
return i+1-p;
}
template <class T>
void insertion_sort(T a[], int n)
{
for (int i=1; i<n; i++)
{
T key = a[i];
int j = i-1;
for (; j>=0 && a[j]>key; j--)
{
a[j+1] = a[j];
}
a[j+1] = key;
}
}
template <class T>
void insertion_sort(T a[], int p, int r)
{
insertion_sort(a+p, r-p+1);
}
template <class T>
int select(T a[], int p, int r, int k)
{
if (r==p)
return a[r];
int i=p;
int m = ceil((r-p+1)/5.0);
T* mid = new T[m];
while (i<r)
{
if (i+4<=r)
{
insertion_sort(a, i, i+4);
mid[(i-p)/5] = a[i+2];
i+=5;
}
else
{
insertion_sort(a, i, r);
mid[m-1] = a[i+(r-i)/2];
i=r+1;
}
}
int x = select(mid, 0, m-1, (m-1)/2);
int index = _partition(a, p, r, x);
delete[] mid;
if (index == k) return x;
else if (index < k)
{
x = select(a, p+index+1, r, k-index-1);
return x;
}
else return select(a, p, p+index-1, k);
}
int main()
{
int a[10] = {2,3,6,9,0,7,1,8,5,10};
for (int i=0; i<10; i++)
{
cout << select(a, 0, 9, i) << ' ';
}
cout << endl;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int SU[100001];
int U[21][100001];
int toL[21][100001];
int n,m,a,b,k,t;
/*inline int cmp(const void *a,const void *b)
{
return *((int *)a) - *((int *)b);
}*/
void buildtree(int l,int r,int d)
{
if (l==r) return;
int mid = (l+r)>>1 , nowl = l , nowr = mid+1 , midtol = 0;
for (int i = mid ;i>=l && SU[i] == SU[mid] ; i--) ++midtol;
for (int i = l ; i <= r ; i++)
{
toL[d][i] = i==l ? 0 : toL[d][i-1];
if (U[d][i] < SU[mid])
{
U[d+1][nowl++] = U[d][i];
++toL[d][i];
}
else if (U[d][i]==SU[mid] && midtol)
{
U[d+1][nowl++] = U[d][i];
++toL[d][i];
--midtol;
}
else U[d+1][nowr++] = U[d][i];
}
buildtree(l,mid,d+1);
buildtree(mid+1,r,d+1);
}
int answer(int a,int b,int k)
{
int l = 1,r = n,d = 0;
int ls,rs,mid;
while (a != b)
{
ls = a==l ? 0 : toL[d][a-1];
rs = toL[d][b];
mid = (l+r)>>1;
if (k <= rs - ls)
{
a = l+ls;
b = l+rs-1;
r = mid;
}
else
{
a = mid+1+a-l-ls;
b = mid+1+b-l-rs;
k -= rs-ls;
l = mid+1;
}
++d;
}
return U[d][a];
}
void init()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d",&t);
SU[i]=U[0][i]=t;
}
//qsort(SU+1,n,sizeof(SU[0]),cmp);
sort(SU+1,SU+n+1);
buildtree(1,n,0);
}
int main()
{
freopen("out.txt","r",stdin);
init();
for (;m;--m)
{
scanf("%d%d%d",&a,&b,&k);
printf("%d\n",answer(a,b,k));
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
freopen("out.txt","w",stdout);
time_t it;
int n,m;
srand(time(&it));
for(int i=0;i<3;++i){//生成3组测试数据
if(i == 0){//第一组使用最坏的数据
n=100000;
m=5000;
}
if(i == 1){//第二组使用稍小一点的数目
n=rand()%10000+50000;
m=rand()%1000+3000;
}
if(i == 2){//第三组更小
n=rand()%10000+1;
m=rand()%2000+1;
}
printf("%d %d\n",n,m);
for(int k=0;k<n;++k){
printf("%d ",rand()%100000000+1);
}
printf("\n");
for(int k=0;k<m;++k){
int a=rand()%n+1;
int b=rand()%n+a;
int c=rand()%(b-a+1)+1;
printf("%d %d %d\n",a,b,c);
}
}
return 0;
}