| ||||||||||
| 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 | |||||||||
算法对了,就一定不会超时么?In Reply To:救命啊 绝对O(N)的算法 为什么还会超时啊 Posted by:sasnzy at 2006-07-03 14:52:23 > #include<iostream>
> #include<stdio.h>
> using namespace std;
> struct Node
> {
> int v,ind;
> Node *next,*pre;
> };
>
> Node *H1,*T1;
> Node *H2,*T2;
> Node N1[1<<20];
> Node N2[1<<20];
> int result[1<<20];
> int n,k;
>
> void init()
> {
> scanf("%d%d",&n,&k);
> scanf("%d",&N1[0].v);
> N2[0].v=N1[0].v;
> N2[0].ind=N1[0].ind=0;
> N1[0].next=NULL;
> N1[0].pre=NULL;
> H1=&N1[0];T1=&N1[0];
> N2[0].next=NULL;
> N2[0].pre=NULL;
> H2=&N2[0];T2=&N2[0];
> }
> void insert1(int i)
> {
> N1[i].pre=NULL;
> N1[i].next=H1;
> H1->pre=&N1[i];
> H1=&N1[i];
> }
> void insert2(int i)
> {
> N2[i].pre=NULL;
> N2[i].next=H2;
> H2->pre=&N2[i];
> H2=&N2[i];
> }
> void del1(int i)
> {
> if (N1[i].next==NULL)
> {
> T1=N1[i].pre;
> N1[i].pre->next=NULL;
> }
> else
> {
> N1[i].pre->next=N1[i].next;
> N1[i].next->pre=N1[i].pre;
> }
> }
> void del2(int i)
> {
> if (N2[i].next==NULL)
> {
> T2=N2[i].pre;
> N2[i].pre->next=NULL;
> }
> else
> {
> N2[i].pre->next=N2[i].next;
> N2[i].next->pre=N2[i].pre;
> }
> }
> void get_ans()
> {
> int i,j;
> for (i=1;i<k-1;i++)
> {
> scanf("%d",&N1[i].v);
> N1[i].ind=i;
> N2[i].ind=i;
> N2[i].v=N1[i].v;
> insert1(i);
> insert2(i);
> Node *tmp=N1[i].next;
> while (tmp!=NULL)
> if (tmp->v>=N1[i].v)
> {
> del1(tmp->ind);
> tmp=tmp->next;
> }
> else break;
> tmp=N2[i].next;
> while (tmp!=NULL)
> if (tmp->v<=N2[i].v)
> {
> del2(tmp->ind);
> tmp=tmp->next;
> }
> else break;
> }
>
> for (i=k-1;i<n;i++)
> {
> scanf("%d",&N1[i].v);
> N1[i].ind=i;
> N2[i].ind=i;
> N2[i].v=N1[i].v;
> insert1(i);
> Node *tmp=N1[i].next;
> while (tmp!=NULL)
> if (tmp->v>=N1[i].v)
> {
> del1(tmp->ind);
> tmp=tmp->next;
> }
> else break;
> if (i==n-1) printf("%d\n",T1->v);
> else printf("%d ",T1->v);
> if (T1->ind==i-k+1)
> del1(T1->ind);
>
> insert2(i);
> tmp=N2[i].next;
> while (tmp!=NULL)
> if (tmp->v<=N2[i].v)
> {
> del2(tmp->ind);
> tmp=tmp->next;
> }
> else break;
> result[i-k+1]=T2->v;
> if (T2->ind==i-k+1)
> del2(T2->ind);
>
> }
> for (i=0;i<n-k+1;i++)
> if (i)
> printf(" %d",result[i]);
> else
> printf("%d",result[0]);
> printf("\n");
> }
>
> int main()
> {
> init();
> get_ans();
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator