手写链表TLE求调
查看原帖
手写链表TLE求调
846661
ARIS1_0楼主2023/9/27 20:23

这是真的手写链表,求大佬来看看 QAQ

链表主体 by 我同机房的大佬

常数优化+ find() 函数 by Me

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
	int x=0,w=1;
	char ch=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*w;
}
void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	static int sta[35];
	int top=0;
	do{
		sta[top++]=x%10,x/=10;
	}while(x);
	while(top)putchar(sta[--top]+'0');
}
template<typename T>
struct List {
    public:
        protected://使外界不能访问 
            int len;
            struct node {
                T v;
                node *pre, *nxt;
            } *head, *tail;
    public:
        class iterator {
            friend List;//能使用node 

            public:
                protected://修复BUG 6.3
                    node *q;
            public:
                T operator * (){
                    return q->v;
                }
                bool operator != (const iterator &x) {//修复BUG 6.3 
                    if (this->q== x.q) {
                        return 0;
                    }
                    return 1;
                }
                iterator operator = (const iterator &x) { 
                    q = x.q;
                    return x;
                }
                iterator operator ++ () {
                    q = q->nxt;
                    iterator x;
                    x.q = q;
                    return x;
                }
                iterator operator ++ (int) {
                    q = q->nxt;
                    iterator x;
                    x.q = q;
                    return x;
                }
        };
    public:
        friend iterator;//能使用q 
        iterator begin() {
            iterator x;
            x.q = head->nxt;
            return x;
        }
        iterator end() {
            iterator x;
            x.q = tail;
            return x;
        }
        List() {//7.21 添加 
            len = 0;
            head = new node();
            tail = new node();
            head->nxt = tail;
            tail->pre = head;
        }
        void insert(int x, const T &v) {
            len++;
            node *q = new node(), *p = head;
            for (int i = 1; i <= x; i++) p = p->nxt;
            q->nxt = p->nxt; q->nxt->pre = q;
            p->nxt = q; q->v = v; q->pre = p;
        }
        int size() {
            return len;
        }

        void print(int l = 1, int le = -1) {//添加新功能 6.3,可不传参 
            iterator it;
            it.q = head;
            it++;//修复BUG 7.21 
            for (int i = 1; i <= l; ++i) it++;//利用迭代器输出 
            if (le != -1) {
                for (int i = 1; i <= le; ++i) {
                    write(*it);putchar(' ');
                    it++;
                }
                cout << "\n";
            }
            else {
                for (int i = 1; i <= len && it.q->nxt != tail; ++i) {
                    write(*it);putchar(' ');
                    it++;
                }
                write(*it);
                cout << "\n";
            }
        }

        void erase(int x) {//O(n) 
            node *p = head;
            len--;
            for (int i = 1; i <= x; i++) p = p->nxt;
            p->pre->nxt = p->nxt;
            p->nxt->pre = p->pre;
            delete p;
        }
        void clear() {
            len = 0;
            node *h = head;
            while (h != tail) {
                h = h->nxt;
                delete head->pre;
            };
        }
        bool empty() {
            return len == 0;
        }

        void push_back(const T &v) {
            len++;
            node *p = new node();
            tail->pre->nxt = p;
            p->pre = tail->pre;
            p->v = v;
            tail->pre = p;
            p->nxt = tail;
        }

        void push_front(const T &v) {
            len++;
            node *p = new node();
            head->nxt->pre = p;
            p->nxt = head->nxt;
            p->v = v;
            head->nxt = p;
            p->pre = head;
        }

        void pop_front() {
            len--;
            node *p = head->nxt;
            head->nxt = p->nxt;
            p->nxt->pre = head;
            delete p;
        }

        void pop_back() {
            len--;
            node *p = tail->pre;
            p->pre->nxt = tail;
            tail->pre = p->nxt;
            delete p;
        }

        List operator = (List &l) {//添加等号6.3 
            clear();
            iterator it;
            for (it = l.begin(); it != l.end(); it++) {
                push_back(*it);
            }
            return l;
        }
        
        int find(const T n) {//返回下标 
        	iterator it;
        	int id=1;
			for(it=begin();it!=end();it++){
				if(*it==n) return id;
				id++;
			}
			return size()+1;
		}
};
int n,m,p,k;
List<int>a;
map<int,int>mp;
int main(){
	n=read();
	a.insert(0,1);
	for(int i=2;i<=n;++i){
		k=read();p=read();
		if(p){
			a.insert(a.find(k),i);//插入右边 
		}else{
			a.insert(a.find(k)-1,i);//插入左边 
		}
	}
	m=read();
	while(m--){
		k=read();
		if(!mp[k]){
			a.erase(a.find(k));
			mp[k]=1;
		}
		//防止多次删除导致的RE 
	}
	a.print(0,-1);//-1代表输出全部 
	return 0;
}
2023/9/27 20:23
加载中...