| ||||||||||
| 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 | |||||||||
不用STL就容易过,不用担心超时#include <iostream>
using namespace std;
int a[1000002];//先用来构建堆,再用来表示当前某个元素的数量
int b[1000002];//出现过的数的升序排列
int c[1000002];//原始数据
int np = 0;//不同数的种数
//堆的实现
void mypush(int x);
void mypop();
int hs = 0;
//二分查找某个数在b中的位置
int bs(int x);
int main()
{
int n;
int m;
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
{
scanf_s("%d", &m);
c[i] = m;
mypush(m);
}
b[0] = a[0];
for (int i = 0; i < n; i++)
{
m = a[0];
mypop();
if (m != b[np])
{
np++;
b[np] = m;
}
}
np++;
for (int i = 0; i <= np; i++)
{
a[i] = 0;
}
int bp = 0, ep = 0;
int num = 0;
while (num < np)//先把所有元素囊括
{
if (a[bs(c[ep])]++ == 0)
{
num++;
}
ep++;
}
ep--;
int ans = ep;//先把最小值定为最初囊括所有元素的长度
while (true)
{
m = c[bp];
bp++;
if ((--a[bs(m)]) <= 0)
{
ep++;
while ((c[ep] != m) && (ep < n))
{
a[bs(c[ep])]++;
ep++;
}
if (ep == n)
{
break;
}
else
{
a[bs(m)]++;
}
}
if ((ep - bp) < ans)
{
ans = ep - bp;
}
}
printf_s("%d\n", ans + 1);//ans之前一直表示为最终答案减1
return 0;
}
void mypush(int x)
{
int me, fa, m;
me = hs;
hs++;
a[me] = x;
while (me)
{
fa = (me - 1) / 2;
if (a[fa] > a[me])
{
m = a[fa];
a[fa] = a[me];
a[me] = m;
}
else
{
break;
}
me = fa;
}
return;
}
void mypop()
{
hs--;
a[0] = a[hs];
int me = 0, son, m;
while (2 * me + 1 < hs)
{
son = 2 * me + 1;
if ((a[son] > a[son + 1]) && (son + 1 < hs))
{
son++;
}
if (a[me] > a[son])
{
m = a[me];
a[me] = a[son];
a[son] = m;
}
else
{
break;
}
me = son;
}
return;
}
int bs(int x)
{
int lp = -1, rp = np, mid;
while (rp - lp > 1)
{
mid = (lp + rp) / 2;
if (b[mid] < x)
{
lp = mid;
}
else
{
rp = mid;
}
}
return rp;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator