| ||||||||||
| 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<fstream>
int f[1000005],p[1000005],q[1000005],ans1[1000005],ans2[1000005],p1,p2,q1,q2,n,m,i;
using namespace std;
int main()
{
ifstream cin("windows.in");
ofstream cout("std.out");
cin>>n>>m;
for (i=0;i<n;i++)
cin>>f[i];
for (i=0;i<n;i++)
{
while (f[i]<=f[p[p2-1]]&&p2>p1)
p2--;
p[p2++]=i;
while (f[i]>=f[q[q2-1]]&&q2>q1)
q2--;
q[q2++]=i;
if (i-p[p1]>=m)
p1++;
if (i-q[q1]>=m)
q1++;
if (i>=m-1)
{
ans1[i]=f[p[p1]];
ans2[i]=f[q[q1]];
}
}
cout<<ans1[m-1];
for (i=m;i<n;i++)
cout<<' '<<ans1[i];
printf("\n");
cout<<ans2[m-1];
for (i=m;i<n;i++)
cout<<' '<<ans2[i];
printf("\n");
}
以上为5秒过的一个程序,也就是传说中的20行..。
然后我把它改成2分。。
#include<fstream>
using namespace std;
ifstream cin("windows.in");
ofstream cout("windows.out");
int minn[1000000+5],maxn[1000000+5],pmin1,pmin2,pmax1,pmax2,f[1000000+5],ansmin[1000000+5],ansmax[1000000+5],m,k;
int main()
{
int i,r,l,mid;
cin>>m>>k;
for(i=0;i<m;++i)
{
cin>>f[i];
r=pmin2;
l=pmin1;
while(l<r)
{
mid=l+r>>1;
if(f[minn[mid]]>f[i])
r=mid;
else
l=mid+1;
}
pmin2=r+1;
minn[r]=i;
r=pmax2;
l=pmax1;
while(l<r)
{
mid=l+r>>1;
if(f[maxn[mid]]<f[i])
r=mid;
else
l=mid+1;
}
pmax2=r+1;
maxn[r]=i;
if(i-minn[pmin1]>=k)
++pmin1;
if(i-maxn[pmax1]>=k)
++pmax1;
if(i>=k-1)
{
ansmin[i]=f[minn[pmin1]];
ansmax[i]=f[maxn[pmax1]];
}
}
for(i=k-1;i<m-1;++i)
cout<<ansmin[i]<<" ";
cout<<ansmin[m-1]<<"\n";
for(i=k-1;i<m-1;++i)
cout<<ansmax[i]<<" ";
cout<<ansmax[m-1]<<"\n";
return 0;
}
结果我传一次超时一次。已经传了2^N*NlogN*N*3次了。。&*(&*@$@)&$!)$&)(!@()*)!。。
求解释。
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator