zoukankan      html  css  js  c++  java
  • [十二省联考2019]异或粽子 (可持久化01tire 堆)

    /*
    查询异或最大值的方法是前缀和一下, 在01trie上二分
    那么我们可以对于n个位置每个地方先求出最大的数, 然后把n个信息扔到堆里, 当我们拿出某个位置的信息时, 将他去除当前最大后最大的信息插入到堆中
    所以动态维护01trie就可以了 
    
    
    
    */
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #define mmp make_pair
    #define ll long long
    #define M 500010
    using namespace std;
    ll read() {
    	ll nm = 0, f = 1;
    	char c = getchar();
    	for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    	for(; isdigit(c); c = getchar()) nm =nm * 10 + c - '0';
    	return nm * f;
    }
    int rt[M], qy[M * 2],  sz[M * 86], lc[M * 86], rc[M * 86], n, k, cnt, tot, biao[M];
    ll a[M], sum[M], ans;
    priority_queue<pair<ll, int> > que;
    
    void insert(int lst, int &now, ll x, int dep) {
    	now = ++cnt;
    	sz[now] = sz[lst] + 1;
    	lc[now] = lc[lst], rc[now] = rc[lst];
    	if(dep == -1) return;
    	if(x & (1ll << dep)) insert(rc[lst], rc[now], x, dep - 1);
    	else insert(lc[lst], lc[now], x, dep - 1);
    }
    
    ll work(int lst, int &now, ll x, int dep) {
    	now = ++cnt;
    	sz[now] = sz[lst] - 1;
    	lc[now] = lc[lst], rc[now] = rc[lst];
    	if(dep == -1) return 0;
    	if(x & (1ll << dep)) 
    	{
    		if(sz[lc[now]]) return (1ll << dep) + work(lc[lst], lc[now], x, dep - 1);
    		else return work(rc[lst], rc[now], x, dep - 1);
    	}
    	else
    	{
    		if(sz[rc[now]]) return (1ll << dep) + work(rc[lst], rc[now], x, dep - 1);
    		else return work(lc[lst], lc[now], x, dep - 1);
    	}
    }
    
    int main() {
    	//freopen("xor2.in", "r", stdin);
    //	freopen("xor.in", "r", stdin); freopen("xor.out", "w", stdout);
    	n = read(), k = read();
    	for(int i = 1; i <= n; i++) a[i] = read(), sum[i] = sum[i - 1] ^ a[i];
    	for(int i = 1; i <= n; i++) {
    		insert(rt[i - 1], rt[i], sum[i - 1], 33);
    		ll now = work(rt[i], qy[i], sum[i], 33);
    		biao[i] = i;
    		que.push(mmp(now, i));
    	}
    	tot = n;
    	for(int i = 1; i <= k; i++) {
    		ans += que.top().first;
    		int now = que.top().second;
    		que.pop();
    		int id = biao[now];
    		if(sz[qy[id]]) {
    			tot++;
    			ll zz = work(qy[id], qy[tot], sum[now], 33);
    			biao[now] = tot;
    			que.push(mmp(zz, now));
    		}
    	}
    	cout << ans << "
    ";
    	return 0;
    }
    
    
  • 相关阅读:
    linux 定时备份数据库
    Web前端优化>javascript优化
    IT项目开发的75条管理守则
    Web前端优化>css 优化
    Web前端优化>图象篇
    SNS关键点
    项目管理(对事不对人)
    Yahoo!网站性能最佳体验的34条黄金守则——内容
    互联网主题知名博客
    Web前端优化>Cookie 优化
  • 原文地址:https://www.cnblogs.com/luoyibujue/p/10667216.html
Copyright © 2011-2022 走看看