zoukankan      html  css  js  c++  java
  • 【CF706D】Vasiliy's Multiset Trie+贪心

    题目大意:需要维护一种数据结构,支持以下三种操作:插入一个数,删除一个数,查询该数据结构中的数异或给定数的最大值。

    题解:如果没有删除操作就是一个标准的 Trie 上贪心求最大异或和问题。现在需要支持删除操作,因此,在树上每个节点维护一个额外的标记,表示有多少个数的某一位经过当前节点。插入操作依然只需修改树上一条链,而删除一个数时,同样需要将这条链上的标记值减 1 即可。这时便可以根据经过的每个点标记值是否为 0 进行贪心操作。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+1;
    
    int trie[maxn<<5][2],tot=1,tag[maxn<<5];
    int q,x;
    
    void modify(int now,int idx,int val){
    	if(idx<0)return;
    	int ch=x>>idx&1;
    	if(!trie[now][ch])trie[now][ch]=++tot;
    	now=trie[now][ch],tag[now]+=val;
    	modify(now,idx-1,val);
    }
    
    int query(int now,int idx,int ans){
    	if(idx<0)return ans;
    	int ch=x>>idx&1;
    	if(tag[trie[now][ch^1]])now=trie[now][ch^1],ans|=1<<idx;
    	else now=trie[now][ch];
    	return query(now,idx-1,ans);
    }
    
    void solve(){
    	char op[2];
    	modify(1,31,1);
    	while(q--){
    		scanf("%s%d",op,&x);
    		if(op[0]=='+')modify(1,31,1);
    		else if(op[0]=='-')modify(1,31,-1);
    		else printf("%d
    ",query(1,31,0));
    	}
    }
    
    int main(){
    	scanf("%d",&q);
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    volatility 命令
    pikachu-SQL注入
    pikachu-环境搭建
    pikachu-暴力破解
    pikachu-XSS
    john and hydra using de-ice1.100
    web 攻击靶机解题过程
    网络对抗实验四
    网络对抗实验三
    网络对抗实验二
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10140811.html
Copyright © 2011-2022 走看看