求助,只有第一个点TLE了(明明用普通链表能过的,为什么字符数组过不了QWQ)
查看原帖
求助,只有第一个点TLE了(明明用普通链表能过的,为什么字符数组过不了QWQ)
769492
ksf130020楼主2022/9/24 22:29

不会题解里那些高大上的数据结构,所以用字符数组做的伪链表,比一般的链表快,但是第一个点过不了

伪链表(只挂第一个):

#include<stdio.h>
#include<stdlib.h>

char a[2000001]={'\0'};

int main(void)
{
	int n,i,t,sum=0,min,max;
	int o,u;
	scanf("%d",&n);
	scanf("%d",&t);
	sum+=t;
	min=max=t;
	a[t+1000000]='1';
	for(i=1;i<n;i++)
	{
		scanf("%d",&t);
		if(a[t+1000000]=='1') continue;
		a[t+1000000]='1';
		if(t<min)
		{
			sum+=min-t;
			min=t;
			continue;
		}
		if(t>max)
		{
			sum+=t-max;
			max=t;
			continue;
		}
		o=t-1;
		u=t+1;
		while(a[o+1000000]!='1') o--;
		while(a[u+1000000]!='1') u++;
		sum+=u-t>t-o?t-o:u-t;
	}
	printf("%d",sum);
	return 0;
}

普通链表(挂了5和6):

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

struct day
{
	int data;
	struct day *next;
};

struct day *create(void)
{
	struct day *p=(struct day *)malloc(sizeof(struct day));
	p->next=NULL;
	return p;
}

int insert(struct day *head,int t)
{
	struct day *p,*q;
	p=head;
	q=head->next;
	if(t<q->data)
	{
		struct day *o=(struct day *)malloc(sizeof(struct day));
		o->data=t;
		p->next=o;
		o->next=q;
		return (int)abs(t-q->data);
	}
	while(t>q->data)
	{
		if(q->next==NULL)
		{
			struct day *o=(struct day *)malloc(sizeof(struct day));
			o->data=t;
			o->next=NULL;
			q->next=o;
			return (int)abs(t-q->data);
		}
		p=p->next;
		q=q->next;
	}
	if(t==q->data) return 0;
	else
	{
		struct day *o=(struct day *)malloc(sizeof(struct day));
		o->data=t;
		p->next=o;
		o->next=q;
		return (int)(abs(t-q->data))>(abs(t-p->data))?(abs(t-p->data)):(abs(t-q->data));
	}
}

int main(void)
{
	struct day *head=create(),*a=(struct day *)malloc(sizeof(struct day));
	head->next=a;
	a->next=NULL;
	int n,sum=0,t,i;
	scanf("%d",&n);
	scanf("%d",&t);
	a->data=t;
	sum+=t;
	for(i=0;i<n-1;i++) 
	{
		scanf("%d",&t);
		sum+=insert(head,t);
	}
	printf("%d",sum);
	return 0;
}
2022/9/24 22:29
加载中...