求助&不理解
查看原帖
求助&不理解
743373
Vitamin_B楼主2024/1/25 16:23
  1. vector版,为什么同时nlogn,vector就只有36pts?
  2. FHQ-Treap版,求Debug qwq,样例AC,提交全TLE+MLE。。
    # include <bits/stdc++.h>
    
    # define ffor(i,name) \
    	for (auto i = name.begin (); i != name.end (); ++ i)
    
    # define iter vector <int> :: iterator
    
    using namespace std;
    
    typedef long long ll;
    
    typedef pair <int, int> pii;
    
    int n, m, op, x, lst, ans, l[1100005], r[1100005], a[1100005], w[1100005], sum[1100005], len, rt;
    
    void pushup (int x) {
    
    	sum[x] = sum[l[x]] + sum[r[x]] + 1;
    
    	return ;
    
    }
    
    pii divide (int x, int k) {
    
    	if (! x)
    		return {0, 0};
    
    	if (a[x] < k) {
    
    		pii son = divide (r[x], k);
    
    		r[x] = son.first;
    
    		pushup (x);
    
    		return {x, son.second};
    
    	}
    
    	pii son = divide (l[x], k);
    
    	l[0] = son.second;
    
    	pushup (x);
    
    	return {son.first, x};
    
    }
    
    int merge (int x, int y) {
    
    	if (! x || ! y)
    		return x + y;
    
    	if (w[x] < w[y]) {
    
    		r[x] = merge (r[x], y);
    
    		pushup (x);
    
    		return x;
    
    	}
    
    	l[y] = merge (x, l[y]);
    
    	pushup (y);
    
    	return y;
    
    }
    
    void insert (int x, int i) {
    
    	a[++ len] = x;
    
    	w[len] = i;
    
    	sum[len] = 1;
    
    	pii t = divide (rt, x);
    
    	rt = merge (merge (t.first, len), t.second);
    
    	return ;
    
    }
    
    void del (int x) {
    
    	pii L = divide (rt, x), R = divide (L.second, x + 1);
    
    	R.first = merge (l[R.first], r[R.first]);
    
    	rt = merge (L.first, merge (R.first, R.second));
    
    	return ;
    
    }
    
    int find1 (int x) {
    
    	pii t = divide (rt, x);
    
    	int ans = sum[t.first] + 1;
    
    	rt = merge (t.first, t.second);
    
    	return ans;
    
    }
    
    int find2 (int x) {
    
    	int now = rt;
    
    	while (now)
    		if (sum[l[now]] + 1 == x)
    			return a[now];
    
    		else if (x <= sum[l[now]])
    			now = l[now];
    		else
    			x -= sum[l[now]] + 1, now = r[now];
    
    	return -1;
    
    }
    
    int last (int x) {
    
    	return find2 (find1 (x) - 1);
    
    }
    
    int next (int x) {
    
    	return find2 (find1 (x + 1));
    
    }
    
    int main () {
    
    	ios::sync_with_stdio (0);
    
    	cin.tie (0);
    
    	cout.tie (0);
    
    	cin >> n >> m;
    
    	for (int i = 1; i <= n; ++ i)
    		cin >> x, insert (x, i);
    
    	for (int i = 1; i <= m; ++ i) {
    
    		cin >> op >> x;
    
    		x ^= lst;
    
    		if (op < 2)
    			insert (x, i + n);
    		else if (op < 3)
    			del (x);
    		else if (op < 4)
    			lst = find1 (x), ans ^= lst;
    		else if (op < 5)
    			lst = find2 (x), ans ^= lst;
    		else if (op < 6)
    			lst = last (x), ans ^= lst;
    		else
    			lst = next (x), ans ^= lst;
    
    	}
    
    	cout << ans;
    
    	return 0;
    
    }
    
2024/1/25 16:23
加载中...