| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
给大家跪了,谁能指点一下我的代码为什么过不了,分桶法平方分割#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define T 1000
#define MAXT 100005/T
using namespace std;
vector<int> bo[MAXT];
int sum[100005];
int a[100005];
int L[5005], R[5005], K[5005];
int N, C;
int bis( vector<int> v, int x)
{
int l = 0 , r = v.size();
while( l + 1 < r)
{
int mid = (l+r) >> 1;
if( v[mid] <= x)
{
l = mid;
}else
r = mid;
}
return l;
}
int main()
{
while( scanf("%d %d",&N,&C) != EOF)
{
for(int i=1; i<=N; i++)
{
scanf("%d", &sum[i]);
a[i] = sum[i];
bo[i/T].push_back(sum[i]);
}
for(int i=0; i<C; i++)
{
scanf("%d %d %d",&L[i],&R[i],&K[i]);
}
sort(sum+1, sum+N+1);
for(int i=0; i<N/T; i++)
{
sort( bo[i].begin(), bo[i].end());
}
for(int i=0; i<C; i++)
{
int ql = L[i], qr = R[i], k = K[i];
int l = 1, r = N;
while( l < r )
{
int mid = (l+r) >> 1;
int x = sum[mid];
int c=0;
int ll = ql, rr = qr;
while( (ll <= rr) && (ll % T) != 1 )
{
if( a[ll++] <= x)
c++;
}
while( (ll <= rr) && ( rr % T) != 0)
{
if( a[rr--] <= x)
{
c++;
}
}
while( ll < rr)
{
int temp = ll / T;
c += upper_bound(bo[temp].begin(),bo[temp].end(),x)-bo[temp].begin();
ll += T;
}
if( c >= k)
r = mid;
else
l = mid+1;
}
printf("%d\n",sum[l]);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator