| ||||||||||
| 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 | |||||||||
贴个c++代码,分桶#include <iostream>
#include <algorithm>
using namespace std;
const int BSize = 1000;
int a[100005];
int sorta[100005];
int bucket[101][BSize];
int main()
{
int n, m, bAmount, left, right, k, fb, lb, fs, ls;//数据规模 操作次数 需要桶的个数 左端点 右端点 序数 首个完整的桶 末个完整的桶 首个下标 末个下标
cin >> n >> m;
bAmount = n / BSize;
for (int i = 0; i < n; i++)
{
//cin >> a[i];
scanf_s("%d", &a[i]);
}
int i1 = 0, i2 = 0;
for (int i = 0; i < n; i++)
{
bucket[i1][i2] = sorta[i] = a[i];
i2++;
if (i2 == BSize)
{
i1++;
i2 = 0;
}
}
for (int i = 0; i < bAmount; i++)
{
sort(bucket[i], bucket[i] + BSize);
}
sort(sorta, sorta + n);
for (int so = 0; so < m; so++)
{
//cin >> left >> right >> k;
scanf_s("%d%d%d", &left, &right, &k);
left--;
right--;
fb = (left + 999) / BSize;
lb = (right + 1) / BSize - 1;
int lp = -1, rp = n - 1, mp, c;
while (rp - lp > 1)
{
mp = (lp + rp) >> 1;
c = 0;
fs = left;
ls = right;
while ((fs < (fb * BSize)) && (fs <= ls))
{
if (a[fs] <= sorta[mp])
{
c++;
}
fs++;
}
while ((ls >= ((lb + 1)*BSize)) && (fs <= ls))
{
if (a[ls] <= sorta[mp])
{
c++;
}
ls--;
}
for (int i = fb; i <= lb; i++)
{
int lw = -1, rw = BSize, mw;
while (rw - lw > 1)
{
mw = (lw + rw) >> 1;
if (bucket[i][mw] > sorta[mp])
{
rw = mw;
}
else
{
lw = mw;
}
}
c += rw;
}
if (c < k)
{
lp = mp;
}
else
{
rp = mp;
}
}
cout << sorta[rp] << '\n';
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator